? ? ? ? 選擇君 作為一個嵌入式工程師打颤,受夠了C語言的各種“低級”暴拄。趁著潮流,想學(xué)學(xué)最近大火的python编饺,期望來年能找個好工作~乖篷。為了增加樂趣期間,還是以實戰(zhàn)為主透且。
? ? ? ? 選擇君每個月都要報銷餐補撕蔼,也就有很多電子發(fā)票要打印。每到此時秽誊,就是一件特別讓人惱火的事情鲸沮。尤其有一次女朋友給找了60幾張 60塊錢的電子發(fā)票。那感覺养距。诉探。。(當(dāng)然~是把這些用軟件合在一起棍厌,然后打印出來噠肾胯,一張張點,不存在的)耘纱。用軟件到時可以實現(xiàn)敬肚,但如果能腳本一件生成,那便是再好不過的事情了束析。
那就讓我們來實現(xiàn)吧:
? ? ? ? python 之所以省力艳馒,是因為有很多底層封裝好的module可以使用。要操作pdf员寇,當(dāng)然要import一個pdf的module:PyPDF2
import PyPDF2,os
1. 安裝 PyPDF2?
pip install PyPDF2
2. 引用+生成路徑下pdf文件列表
import PyPDF2弄慰,os
#1. get all pdf in current loaction
pdfs = []
for filename in os.listdir('.'): #在路徑下所有文件中,查找 pdf 文件
? ? if filename.endswith('.pdf'):
? ? ? ? pdfs.append(filename)
if pdfs == []:
? ? print ("no pdf in this file, please double check")
pdfs.sort(key=str.lower)
3. 調(diào)用 PyPDF2.PdfFileWriter(), 用來放合成之后的pdf
pdfWriter = PyPDF2.PdfFileWriter()
4. 調(diào)用 PyPDF2.PdfFileRead(), 用來讀取所有pdf中的內(nèi)容蝶锋,并合成到 pdfWriter中:
fileCount = 0
pageCount = 0
for filename in pdfs:
? ? pdfFileObj = open(filename,'rb')
? ? print("file:"+filename+" combining")
? ? pdfReader? = PyPDF2.PdfFileReader(pdfFileObj)
? ? fileCount += 1
? ? #3.1 get all pages from read file, and then combine to one
? ? for pageNum in range(0,pdfReader.numPages):
? ? ? ? pageObj = pdfReader.getPage(pageNum)
? ? ? ? pdfWriter.addPage(pageObj)
? ? ? ? pageCount += 1
? ? #pdfFileObj.close()
print("combine sucess: %d files, %d pages combined"%(fileCount,pageCount))
5. 將合成的pdf 寫入文件中陆爽,并將之前打開的文件關(guān)閉掉
注:選擇君本來是打算在第4部關(guān)閉之前打開的pdf的,但如果那時候打開扳缕,最后合成的文件會是一個由空白頁構(gòu)成的pdf慌闭。想了一下别威,合成的時候,應(yīng)該只是將“指針”傳給了 pdfWriter驴剔。在pdfWriter寫入磁盤之前省古,如果關(guān)閉文件,就找不到內(nèi)容了丧失。所以豺妓,我們在合成文件寫入磁盤之后,再關(guān)閉之
#4 save the write page
pdfOutput = open('result1.pdf','wb')
pdfWriter.write(pdfOutput)
pdfOutput.close()
#5 close other pdf files
for filename in pdfs:
? ? pdfFileObj = open(filename,'rb')
? ? pdfFileObj.close()
OK布讹,這樣就可以將目錄下的所有文件科侈,合成出了一個 “result1.pdf”啦
整體的源代碼如下:
#! python3
# combine multiple pdf file to one
import PyPDF2, os
#1. get all pdf in current loaction
pdfs = []
for filename in os.listdir('.'):
? ? if filename.endswith('.pdf'):
? ? ? ? pdfs.append(filename)
if pdfs == []:
? ? print ("no pdf in this file, please double check")
pdfs.sort(key=str.lower)
#2. create a empty pdf as the dest pdf
pdfWriter = PyPDF2.PdfFileWriter()
#3. read all pdfs, and combine to 1
fileCount = 0
pageCount = 0
for filename in pdfs:
? ? pdfFileObj = open(filename,'rb')
? ? print("file:"+filename+" combining")
? ? pdfReader? = PyPDF2.PdfFileReader(pdfFileObj)
? ? fileCount += 1
? ? #3.1 get all pages from read file, and then combine to one
? ? for pageNum in range(0,pdfReader.numPages):
? ? ? ? pageObj = pdfReader.getPage(pageNum)
? ? ? ? pdfWriter.addPage(pageObj)
? ? ? ? pageCount += 1
? ? #pdfFileObj.close()
print("combine sucess: %d files, %d pages combined"%(fileCount,pageCount))
#4 save the write page
pdfOutput = open('result1.pdf','wb')
pdfWriter.write(pdfOutput)
pdfOutput.close()
#5 close other pdf files
for filename in pdfs:
? ? pdfFileObj = open(filename,'rb')
? ? pdfFileObj.close()