2010-08-09 117 views
55

我做了一個搜索,似乎沒有什麼與這個問題直接相關。是否有可能使用Python來合併單獨的PDF文件?合併PDF文件

假設是這樣,我需要進一步擴展這一點。我希望循環瀏覽目錄中的文件夾並重復此過程。

我可能會推動我的運氣,但可以排除PDF中包含的頁面(我的報告生成總是會創建一個額外的空白頁面)。

回答

76

使用Pypdf或其繼任PyPDF2

一個純Python庫內置的PDF工具包。它能夠:
*拆分文件一頁一頁,
*通過頁面合併文檔頁面,

(以及更多)

下面是一個示例程序,與這兩個版本的作品。

#!/usr/bin/env python 
import sys 
try: 
    from PyPDF2 import PdfFileReader, PdfFileWriter 
except ImportError: 
    from pyPdf import PdfFileReader, PdfFileWriter 

def pdf_cat(input_files, output_stream): 
    input_streams = [] 
    try: 
     # First open all the files, then produce the output file, and 
     # finally close the input files. This is necessary because 
     # the data isn't read from the input files until the write 
     # operation. Thanks to 
     # https://stackoverflow.com/questions/6773631/problem-with-closing-python-pypdf-writing-getting-a-valueerror-i-o-operation/6773733#6773733 
     for input_file in input_files: 
      input_streams.append(open(input_file)) 
     writer = PdfFileWriter() 
     for reader in map(PdfFileReader, input_streams): 
      for n in range(reader.getNumPages()): 
       writer.addPage(reader.getPage(n)) 
     writer.write(output_stream) 
    finally: 
     for f in input_streams: 
      f.close() 

if __name__ == '__main__': 
    pdf_cat(sys.argv[1:], sys.stdout) 
+17

而現在,https://pypi.python.org/pypi/PyPDF2的後繼項目PyPDF – 2013-08-22 10:04:37

+0

@伊阿古,利托下面看[這裏](https://stackoverflow.com/a/37945454/1540468)回答。 – 2017-12-13 09:10:41

4

使用Python合併單獨的PDF文件可能嗎?

是的。

下面的例子合併在一個文件夾中的所有文件到一個新的PDF文件:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from argparse import ArgumentParser 
from glob import glob 
from pyPdf import PdfFileReader, PdfFileWriter 
import os 

def merge(path, output_filename): 
    output = PdfFileWriter() 

    for pdffile in glob(path + os.sep + '*.pdf'): 
     if pdffile == output_filename: 
      continue 
     print("Parse '%s'" % pdffile) 
     document = PdfFileReader(open(pdffile, 'rb')) 
     for i in range(document.getNumPages()): 
      output.addPage(document.getPage(i)) 

    print("Start writing '%s'" % output_filename) 
    with open(output_filename, "wb") as f: 
     output.write(f) 

if __name__ == "__main__": 
    parser = ArgumentParser() 

    # Add more options if you like 
    parser.add_argument("-o", "--output", 
         dest="output_filename", 
         default="merged.pdf", 
         help="write merged PDF to FILE", 
         metavar="FILE") 
    parser.add_argument("-p", "--path", 
         dest="path", 
         default=".", 
         help="path of source PDF files") 

    args = parser.parse_args() 
    merge(args.path, args.output_filename) 
1

這裏,http://pieceofpy.com/2009/03/05/concatenating-pdf-with-python/,給出了一個解決方案。

類似:

from pyPdf import PdfFileWriter, PdfFileReader 

def append_pdf(input,output): 
    [output.addPage(input.getPage(page_num)) for page_num in range(input.numPages)] 

output = PdfFileWriter() 

append_pdf(PdfFileReader(file("C:\\sample.pdf","rb")),output) 
append_pdf(PdfFileReader(file("c:\\sample1.pdf","rb")),output) 
append_pdf(PdfFileReader(file("c:\\sample2.pdf","rb")),output) 
append_pdf(PdfFileReader(file("c:\\sample3.pdf","rb")),output) 

    output.write(file("c:\\combined.pdf","wb")) 
51

較新PyPdf2庫有一個PdfMerger類,它可以像這樣被使用。

例如:

from PyPDF2 import PdfFileMerger 

pdfs = ['file1.pdf', 'file2.pdf', 'file3.pdf', 'file4.pdf'] 

merger = PdfFileMerger() 

for pdf in pdfs: 
    merger.append(open(pdf, 'rb')) 

with open('result.pdf', 'wb') as fout: 
    merger.write(fout) 

append方法似乎需要一個懶惰文件對象。那就是它不會立即讀取文件。它似乎要等到write方法被調用。如果使用範圍開放(即with),則會將空白頁附加到結果文件中,因爲輸入文件在該點處關閉。

如果文件句柄生存期是一個問題,避免這種情況的最簡單方法是傳遞append文件名字符串並允許它處理文件生存期。

from PyPDF2 import PdfFileMerger 

pdfs = ['file1.pdf', 'file2.pdf', 'file3.pdf', 'file4.pdf'] 

merger = PdfFileMerger() 

for pdf in pdfs: 
    merger.append(pdf) 

merger.write("result.pdf") 
1

pdfrw library可以做到這一點很容易,假設你並不需要保存書籤和註釋,以及您的PDF不加密。 cat.py是一個示例級聯腳本,subset.py是一個示例頁面子集化腳本。

串聯腳本的相關部分 - 假設inputs輸入文件名列表,並outfn是一個輸出文件名:

from pdfrw import PdfReader, PdfWriter 

writer = PdfWriter() 
for inpfn in inputs: 
    writer.addpages(PdfReader(inpfn).pages) 
writer.write(outfn) 

正如你由此可以看出,這將是很容易省略最後一頁,例如例如:

writer.addpages(PdfReader(inpfn).pages[:-1]) 

聲明:我是主要pdfrw作者。

1

合併目錄中的所有pdf文件

將pdf文件放在目錄中。啓動程序。您將得到一份pdf,併合並所有pdf。

import os 
from PyPDF2 import PdfFileMerger 

x = [a for a in os.listdir() if a.endswith(".pdf")] 

merger = PdfFileMerger() 

for pdf in x: 
    merger.append(open(pdf, 'rb')) 

with open("result.pdf", "wb") as fout: 
    merger.write(fout)