如何用Python程序將幾十個PDF文件合併成一個PDF?其實只要這四步

異步社區 發佈 2020-05-25T05:15:34+00:00

假定你有一個很無聊的任務,需要將幾十個PDF文件合併成一個PDF文件。每一個文件都有一個封面作為第一頁,但你不希望合併後的文件中重複出現這些封面。即使有許多免費的程序可以合併PDF,很多也只是簡單的將文件合併在一起。讓我們來寫一個Python程序,定製需要合併到PDF中的頁面。

假定你有一個很無聊的任務,需要將幾十個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編程的快樂。


關鍵字: