背景
一份 PDF 學習資料需要打印其中某幾頁,文件有幾百兆,看到 WPS 有PDF拆分功能,但是需要會員,開了一個月會員后完成了轉換。突然想到,會員到期后如果還要拆解的話,怎么辦呢?PDF 文件拆解功能,自己寫一個唄。
輸入需求
Python 實現對 PDF從截取某幾頁的功能
根據輸出的方案,拷貝代碼到 PyCharm 編輯器:
from PyPDF2 import PdfFileWriter, PdfFileReaderdef extract_pages(input_pdf_path, output_pdf_path, start_page, end_page):"""從PDF文件中截取指定頁碼范圍的頁面,并保存為新的PDF文件。:param input_pdf_path: 輸入PDF文件路徑:param output_pdf_path: 輸出PDF文件路徑:param start_page: 開始頁碼(從0開始):param end_page: 結束頁碼(不包含該頁)"""# 創建PdfFileWriter對象output = PdfFileWriter()# 打開輸入PDF文件with open(input_pdf_path, "rb") as input_pdf_file:pdf_file = PdfFileReader(input_pdf_file)pdf_pages_len = pdf_file.getNumPages()# 檢查頁碼范圍是否有效if start_page < 0 or end_page > pdf_pages_len or start_page >= end_page:raise ValueError("無效的頁碼范圍")# 添加指定頁碼范圍的頁面到輸出文件for i in range(start_page, end_page):output.addPage(pdf_file.getPage(i))# 保存輸出文件with open(output_pdf_path, "wb") as output_pdf_file:output.write(output_pdf_file)# 示例調用
input_pdf_path = "input.pdf"
output_pdf_path = "output.pdf"
start_page = 0 # 從第一頁開始(頁碼從0開始)
end_page = 5 # 截止到第5頁(不包含第5頁)extract_pages(input_pdf_path, output_pdf_path, start_page, end_page)
依賴安裝及運行
第一步,執行命令pip install PyPDF2
完成依賴的安裝。
第二步,修改 input_pdf_path 、output_pdf_path 及頁碼信息。
第三步,執行腳本,有報錯:
- PdfFileWriter is deprecated and was removed in PyPDF2 3.0.0. Use PdfWriter instead.
- PdfFileReader is deprecated and was removed in PyPDF2 3.0.0. Use PdfReader instead.
- reader.getNumPages is deprecated and was removed in PyPDF2 3.0.0. Use len(reader.pages) instead.
- reader.getPage(pageNumber) is deprecated and was removed in PyPDF2 3.0.0. Use reader.pages[page_number] instead.
- addPage is deprecated and was removed in PyPDF2 3.0.0. Use add_page instead.
按照提示,修改廢棄方法為最新方法后的代碼如下:
from PyPDF2 import PdfWriter, PdfReaderdef extract_pages(input_pdf_path, output_pdf_path, start_page, end_page):"""從PDF文件中截取指定頁碼范圍的頁面,并保存為新的PDF文件。:param input_pdf_path: 輸入PDF文件路徑:param output_pdf_path: 輸出PDF文件路徑:param start_page: 開始頁碼(從0開始):param end_page: 結束頁碼(不包含該頁)"""# 創建PdfWriter對象output = PdfWriter()# 打開輸入PDF文件with open(input_pdf_path, "rb") as input_pdf_file:pdf_file = PdfReader(input_pdf_file)pdf_pages_len = len(pdf_file.pages)# 檢查頁碼范圍是否有效if start_page < 0 or end_page > pdf_pages_len or start_page >= end_page:raise ValueError("無效的頁碼范圍")# 添加指定頁碼范圍的頁面到輸出文件for i in range(start_page, end_page):output.add_page(pdf_file.pages[i])# 保存輸出文件with open(output_pdf_path, "wb") as output_pdf_file:output.write(output_pdf_file)# 示例調用
input_pdf_path = "/Applications/2022MyTextFiles/A.pdf"
output_pdf_path = "/Applications/2022MyTextFiles/B.pdf"
start_page = 0 # 從第一頁開始(頁碼從0開始)
end_page = 5 # 截止到第5頁(不包含第5頁)extract_pages(input_pdf_path, output_pdf_path, start_page, end_page)
運行正常,搞定了!
白開了一個月的會員啊!