不知道大家有沒有遇到過這麼一種情況,就比如一個pdf格式的電子書,我們經常瀏覽的是其中的一部分,而這電子書的頁數很大,每當需要瀏覽時,就需要翻到對應的頁碼,就有點兒繁瑣。
還有一些情況,比如,我們想分享pdf檔案裡的部分內容給別人,我們也需要用到pdf分頁,不僅可以分析指定內容,而且也可以減少傳送檔案的大小O(∩_∩)O哈哈~
總之,pdf的分頁,我們在現實生活中,是難免會遇到的事。當你遇到時,你是怎麼解決的呢?
在Python中,實現pdf分頁,是極其簡單快速的,只需要執行幾行程式碼,即可實現,不管你的pdf檔案有多大,下面讓我們一起來看看吧~
注:每部分程式碼的作用,我都註釋再來程式碼後面,注意檢視喔~
from PyPDF2 import PdfFileReader, PdfFileWriter
import os
def split(path, page_num):
try: # 捕獲值異常錯誤,就是隻輸入了一個頁數的時候
page_start, page_end = page_num.split()
except ValueError:
page_start = page_num
page_end = page_num
output_name = os.path.splitext(path)[0] + f'({page_start}-{page_end}).pdf' # 輸出分割後的pdf檔案
page_start, page_end = int(page_start), int(page_end) # 將頁碼轉為整數型別
if os.path.splitext(path)[1] == '': # 判斷檔案格式是否以.pdf結尾
path = path + ".pdf"
try:
pdf = PdfFileReader(path) # 讀取pdf
except FileNotFoundError:
print("Error:請確認您輸入的pdf檔案是否存在!")
return
pdf_writer = PdfFileWriter() # pdf寫入物件
if page_start < 1 or page_end > pdf.getNumPages(): # 判斷頁碼是否在合理範圍內,即有沒有小於或大於pdf檔案的頁數
print("Error:頁碼超出合理範圍,請確定您輸入的頁數區間在合理範圍之內!")
return
for page in range(page_start-1, page_end): # 需要分割的pdf頁數區間,因為讀取的頁數是從0開始計數的,所以減1
pdf_writer.addPage(pdf.getPage(page)) # pdf頁數讀取,存於記憶體,並未開始寫入
with open(output_name, 'wb') as output_pdf:
pdf_writer.write(output_pdf) # 開始寫入指定頁數區間的pdf
print("分頁完成,注意查收:" + output_name)
if __name__ == '__main__':
source_path = input("請輸入需要分割的pdf的檔案:") # 需要分割的pdf檔案
pages = input("請輸入分割的起始頁和終止頁,以空格分開:")
split(source_path, pages)
其實最主要的程式碼就下面的幾行:
pdf = PdfFileReader(path) # 讀取pdf
pdf_writer = PdfFileWriter() # pdf寫入物件
for page in range(page_start, page_end): # 需要分割的pdf頁數區間
pdf_writer.addPage(pdf.getPage(page)) # pdf頁數讀取,存於記憶體,並未開始寫入
with open(output_name, 'wb') as output_pdf:
pdf_writer.write(output_pdf) # 開始寫入指定頁數區間的pdf
我只是在其基礎上增加了一些異常錯誤捕獲並解決的程式碼,並實現程式碼的迴圈利用,而不是隻針對於一個pdf檔案。
程式碼使用展示:
1.原始檔
書的頁數還是挺大的
2.目標頁數區間
注意,雖然這裡的頁碼是271
,但並不代表就是271
,因為讀取的pdf檔案頁碼是整個檔案的頁碼,就比如書的封面,目錄的頁數也得包含進去。
所以,我們可以簡單算一下,書的頁碼第一頁與到封面差了幾頁,我這裡差的是13
頁,所以就是271+13=284
作為分割起始頁,需要擷取的頁數對應書上的頁碼是276
,276+13=289
,所以終止頁就是289
了
3.程式碼執行
4.異常捕獲的程式碼展示:
輸入的起始頁小於1:
pdf頁碼一共才600頁,然後輸入了終止頁為700:
5.其它
要求的是區間,但你可以輸入1 1
,1
:
程式碼還可以繼續完善,感興趣的小夥伴可以開動開動一下自己聰明的腦袋瓜子haha