2010-08-09 16 views
55

Poszukałem i nic nie wydawało się być bezpośrednio związane z tym pytaniem. Czy jest możliwe, aby za pomocą Pythona scalić oddzielne pliki PDF?Scalanie plików PDF

Zakładając, że tak, muszę rozszerzyć to nieco dalej. Mam nadzieję, że przejdę do folderu w katalogu i powtórzę tę procedurę.

Mogę też naciskać na moje szczęście, ale czy można wykluczyć stronę zawartą w plikach PDF (moja generacja raportów zawsze tworzy dodatkową pustą stronę).

Odpowiedz

76

Zastosowanie Pypdf lub jego następca PyPDF2:

Biblioteka Pure-Python zbudowany jako zestaw narzędzi PDF. Jest zdolny do:
* strona opisuje rozwarstwieniem stronie
* strona dokumenty łączące po stronie,

(i dużo więcej)

Oto przykładowy program, który współpracuje z obiema wersjami.

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

A teraz https://pypi.python.org/pypi/PyPDF2 który jest następcą projekt PyPDF –

+0

@ Iago-Lito spojrzeć poniżej, aby [to] (https://stackoverflow.com/a/37945454/1540468) odpowiedź. –

4

Czy to możliwe, przy użyciu Python, aby połączyć oddzielne pliki PDF?

Tak.

Poniższy przykład łączy wszystkie pliki w jednym folderze na jednym nowym pliku 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

tutaj, http://pieceofpy.com/2009/03/05/concatenating-pdf-with-python/, daje rozwiązanie.

podobnie:

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

Nowsza PyPdf2 biblioteka ma PdfMerger klasy, które mogą być używane jak tak.

przykład:

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) 

Sposób append wydaje się wymagać leniwe obiekt pliku. To znaczy, że nie od razu odczytuje plik. Wydaje się czekać, aż zostanie wywołana metoda write. Jeśli używasz zakresu o ograniczonym zasięgu (tj. with) dołącza puste strony do pliku wynikowego, ponieważ plik wejściowy jest w tym momencie zamknięty.

Najprostszym sposobem na uniknięcie tego problemu, jeśli czas życia uchwytu pliku jest problemem, jest przekazywanie ciągów nazw plików w formacie append i umożliwienie im obsługi cyklu życia pliku.

tj

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 można to zrobić dość łatwo, zakładając, że nie trzeba zachować zakładek i notatek, a Twoje pliki PDF nie są szyfrowane. cat.py to przykładowy skrypt łączenia, a subset.py to przykładowy skrypt podzbioru stron.

Istotna część skryptu konkatenacji - zakłada inputs znajduje się lista nazw plików wejściowych i outfn to nazwa pliku wyjściowego:

from pdfrw import PdfReader, PdfWriter 

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

Jak widać z tego, byłoby to dość łatwe do pomiń ostatnią stronę, np coś takiego:

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

Nota prawna: Jestem głównym autorem pdfrw.

1

scalić wszystkie pliki PDF, które są obecne w reż

Umieść pliki PDF w reż. Uruchom program. Otrzymasz jeden plik PDF z połączonymi plikami 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) 
Powiązane problemy