2010-08-09 10 views
55

habe ich eine Suche und nichts schien wirklich direkt auf diese Frage bezogen werden. Ist es möglich, mit Python separate PDF-Dateien zusammenzuführen?Merge PDF-Dateien

Angenommen, ich muss dies ein wenig weiter ausbauen. Ich hoffe, Ordner in einem Verzeichnis durchlaufen zu lassen und diesen Vorgang zu wiederholen.

Und ich drücke mein Glück, aber ist es möglich, eine Seite auszuschließen, die in den PDFs enthalten ist (meine Berichtgeneration erstellt immer eine extra leere Seite).

Antwort

76

Verwendung Pypdf oder sein Nachfolger PyPDF2:

A Pure-Python-Bibliothek als PDF-Toolkit gebaut. Es ist in der Lage:
* Splitting Dokumente Seite für Seite,
* verschmelzenden Dokumente Seite für Seite,

(und vieles mehr)

Hier ist ein Beispielprogramm, das mit beiden Versionen funktioniert.

#!/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

Und jetzt https://pypi.python.org/pypi/PyPDF2 das Nachfolgeprojekt PyPDF ist –

+0

@ iago-lito siehe unten [diese] zu (https://stackoverflow.com/a/37945454/1540468) antwort. –

4

Ist es möglich, Python, separate PDF-Dateien zusammenführen?

Ja.

Das folgende Beispiel führt alle Dateien in einem Ordner zu einer einzigen neuen PDF-Datei:

#!/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

hier, http://pieceofpy.com/2009/03/05/concatenating-pdf-with-python/, eine Lösung gibt.

ähnlich:

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

Die neuere PyPdf2 Bibliothek hat eine PdfMerger Klasse, die wie so verwendet werden kann.

Beispiel:

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) 

Die append Methode scheint ein faules Dateiobjekt zu verlangen. Das heißt, es liest die Datei nicht sofort. Es scheint zu warten, bis die write Methode aufgerufen wird. Wenn Sie einen offenen Bereich verwenden (d. H. with), fügt er der resultierenden Datei leere Seiten hinzu, da die Eingabedatei zu diesem Zeitpunkt geschlossen ist.

Der einfachste Weg, dies zu vermeiden, wenn die Dateizugriffsdauer ein Problem ist, besteht darin, append Dateinamenszeichenfolgen zu übergeben und die Dateilebensdauer zu verarbeiten.

heißt

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

Die pdfrw library dies ganz einfach tun können, Sie unter der Annahme nicht Lesezeichen und Anmerkungen bewahren müssen, und Ihre PDF-Dateien werden nicht verschlüsselt. cat.py ist ein Beispiel Verkettung Skript und subset.py ist ein Beispiel Seite subsetting Skript.

Der relevante Teil des Verkettungs Skript - geht davon aus inputs eine Liste der Eingabedateinamen ist, und outfn ist eine Ausgabedateiname:

from pdfrw import PdfReader, PdfWriter 

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

Wie Sie daraus ersehen können, wäre es ziemlich einfach sein, die letzte Seite weglassen, z so etwas wie:

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

Disclaimer: Ich bin der primäre pdfrw Autor.

1

Merge alle PDF-Dateien, die

in einem Verzeichnis vorhanden sind Legen Sie die PDF-Dateien in einem Verzeichnis. Starten Sie das Programm. Sie erhalten ein PDF mit allen zusammengelegten PDFs.

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)