假定你有一個很無聊的任務,需要將幾十個PDF文件合併成一個PDF文件。每一個文件都有一個封面作為第一頁,但你不希望合併後的文件中重複出現這些封面。即使有許多免費的程序可以合併PDF,很多也只是簡單的將文件合併在一起。讓我們來寫一個Python程序,定製需要合併到PDF中的頁面。
總的來說,該程序需要完成:
- 找到當前工作目錄中所有PDF文件。
- 按文件名排序,這樣就能有序地添加這些PDF。
- 除了第一頁之外,將每個PDF的所有頁面寫入輸出的文件。
從實現的角度來看,代碼需要完成下列任務:
- 調用os.listdir(),找到當前工作目錄中的所有文件,去除掉非PDF文件。
- 調用Python的sort()列表方法,對文件名按字母排序。
- 為輸出的PDF文件創建PdfFileWriter對象。
- 循環遍歷每個PDF文件,為它創建PdfFileReader對象。
- 針對每個PDF文件,循環遍歷每一頁,第一頁除外。
- 將頁面添加到輸出的PDF。
- 將輸出的PDF寫入一個文件,名為<em>allminutes.pdf</em>。
針對這個項目,打開一個新的文件編輯器窗口,將它保存為combinePdfs.py。
第1步:找到所有PDF文件
首先,程序需要取得當前工作目錄中所有帶.pdf擴展名的文件列表,並對它們排序。讓你的代碼看起來像這樣:
#! python3
# combinePdfs.py - Combines all the PDFs in the current working directory into
# into a single PDF.
❶ import PyPDF2, os
# Get all the PDF filenames.
pdfFiles = []
for filename in os.listdir('.'):
if filename.endswith('.pdf'):
❷ pdfFiles.append(filename)
❸ pdfFiles.sort(key=str.lower)
❹ pdfWriter = PyPDF2.PdfFileWriter()
# TODO: Loop through all the PDF files.
# TODO: Loop through all the pages (except the first) and add them.
# TODO: Save the resulting PDF to a file.
在#!行和介紹程序做什麼的描述性注釋之後,代碼導入了os和PyPDF2模塊❶。os.listdir(『.』)調用將返回當前工作目錄中所有文件的列表。代碼循環遍歷這個列表,將帶有.pdf擴展名的文件添加到pdfFiles中❷。然後,列表按照字典順序排序,調用sort()時帶有key/str.lower關鍵字參數❸。
代碼創建了一個PdfFileWriter對象,保存合併後的PDF頁面❹。最後,一些注釋語句簡要描述了剩下的程序。
第2步:打開每個PDF文件
現在,程序必須讀取pdfFiles中的每個PDF文件。在程序中加入以下代碼:
#! python3
# combinePdfs.py - Combines all the PDFs in the current working directory into
# a single PDF.
import PyPDF2, os
# Get all the PDF filenames.
pdfFiles = []
--snip--
# Loop through all the PDF files.
for filename in pdfFiles:
pdfFileObj = open(filename, 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
# TODO: Loop through all the pages (except the first) and add them.
# TODO: Save the resulting PDF to a file.
針對每個PDF文件,循環內的代碼調用open(),以』wb』作為第二個參數,用讀二進位的模式打開文件。open()調用返回一個 File 對象,它被傳遞給PyPDF2.PdfFileReader(),創建針對那個PDF文件的PdfFileReader對象。
第3步:添加每一頁
針對每個PDF文件,需要循環遍歷每一頁,第一頁除外。在程序中添加以下代碼:
#! python3
# combinePdfs.py - Combines all the PDFs in the current working directory into
# a single PDF.
import PyPDF2, os
--snip--
# Loop through all the PDF files.
for filename in pdfFiles:
--snip--
# Loop through all the pages (except the first) and add them.
❶ for pageNum in range(1, pdfReader.numPages):
pageObj = pdfReader.getPage(pageNum)
pdfWriter.addPage(pageObj)
# TODO: Save the resulting PDF to a file.
for循環內的代碼將每個Page對象拷貝到PdfFileWriter對象。要記住,你需要跳過第一頁。因為PyPDF2認為0是第一頁,所以循環應該從1開始❶,然後向上增長到pdfReader.numPages中的整數,但不包括它。
第4步:保存結果
在這些嵌套的for循環完成後,pdfWriter變量將包含一個PdfFileWriter對象,合併了所有PDF的頁面。最後一步是將這些內容寫入硬碟上的一個文件。在程序中添加以下代碼:
#! python3
# combinePdfs.py - Combines all the PDFs in the current working directory into
# a single PDF.
import PyPDF2, os
--snip--
# Loop through all the PDF files.
for filename in pdfFiles:
--snip--
# Loop through all the pages (except the first) and add them.
for pageNum in range(1, pdfReader.numPages):
--snip--
# Save the resulting PDF to a file.
pdfOutput = open('allminutes.pdf', 'wb')
pdfWriter.write(pdfOutput)
pdfOutput.close()
向open()傳入』wb』,以寫二進位的模式打開輸出PDF文件allminutes.pdf。然後,將得到的File對象傳給write()方法,創建實際的PDF文件。調用close()方法,結束程序。
第5步:類似程序的想法
能夠利用其他PDF文件的頁面創建PDF文件,這讓你的程序能完成以下任務:
- 從PDF文件中截取特定的頁面。
- 重新調整PDF文件中頁面的次序。
- 創建一個PDF文件,只包含那些具有特定文本的頁面。文本由extractText()來確定。
本文摘自:《Python編程快速上手 讓繁瑣工作自動化》
本書是一本面向實踐的Python編程實用指南。本書的目的,不僅是介紹Python語言的基礎知識,而且還通過項目實踐教會讀者如何應用這些知識和技能。本書的第一部分介紹了基本的Python編程概念,第二部分介紹了一些不同的任務,通過編寫Python程序,可以讓計算機自動完成它們。第二部分的每一章都有一些項目程序,供讀者學習。每章的末尾還提供了一些習題和深入的實踐項目,幫助讀者鞏固所學的知識。附錄部分提供了所有習題的解答。
本書適合任何想要通過Python學習編程的讀者,尤其適合缺乏編程基礎的初學者。通過閱讀本書,讀者將能利用最強大的程式語言和工具,並且將體會到Python編程的快樂。