Python实战之 多pdf文件合成

        选择君 作为一个嵌入式工程师,受够了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()

你可能感兴趣的:(Python实战之 多pdf文件合成)