选择君 作为一个嵌入式工程师,受够了C语言的各种“低级”。趁着潮流,想学学最近大火的python,期望来年能找个好工作~。为了增加乐趣期间,还是以实战为主。
选择君每个月都要报销餐补,也就有很多电子发票要打印。每到此时,就是一件特别让人恼火的事情。尤其有一次女朋友给找了60几张 60块钱的电子发票。那感觉。。。(当然~是把这些用软件合在一起,然后打印出来哒,一张张点,不存在的)。用软件到时可以实现,但如果能脚本一件生成,那便是再好不过的事情了。
那就让我们来实现吧:
python 之所以省力,是因为有很多底层封装好的module可以使用。要操作pdf,当然要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. 调用 PyPDF2.PdfFileWriter(), 用来放合成之后的pdf
pdfWriter = PyPDF2.PdfFileWriter()
4. 调用 PyPDF2.PdfFileRead(), 用来读取所有pdf中的内容,并合成到 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 写入文件中,并将之前打开的文件关闭掉
注:选择君本来是打算在第4部关闭之前打开的pdf的,但如果那时候打开,最后合成的文件会是一个由空白页构成的pdf。想了一下,合成的时候,应该只是将“指针”传给了 pdfWriter。在pdfWriter写入磁盘之前,如果关闭文件,就找不到内容了。所以,我们在合成文件写入磁盘之后,再关闭之
#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()