2010-08-09 25 views
55

Hice una búsqueda y nada realmente parecía estar directamente relacionado con esta pregunta. ¿Es posible, usando Python, fusionar archivos PDF separados?Fusionar archivos PDF

Asumiendo eso, necesito extender esto un poco más. Espero recorrer las carpetas de un directorio y repetir este procedimiento.

Y puedo estar empujando mi suerte, pero ¿es posible excluir una página que está contenida en los PDF (la generación de mi informe siempre crea una página en blanco adicional).

Respuesta

76

Uso Pypdf o su sucesor PyPDF2:

Una biblioteca Pure-Python construido como un conjunto de herramientas de PDF. Es capaz de: *
página divide los documentos por página,
* página de los documentos que se fusionan por página,

(y mucho más)

Aquí hay un ejemplo de programa que trabaja con ambas versiones.

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

Y ahora, https://pypi.python.org/pypi/PyPDF2 que es el proyecto sucesor PyPDF –

+0

@ iago-lito Vea a continuación para [esto] (https://stackoverflow.com/a/37945454/1540468) respuesta. –

4

¿Es posible, usando Python, para combinar archivos PDF separados?

Sí.

El siguiente ejemplo se combinan todos los archivos de una carpeta a un nuevo archivo 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

aquí, http://pieceofpy.com/2009/03/05/concatenating-pdf-with-python/, da una solución.

parecida:

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

La nueva biblioteca tiene PyPdf2PdfMerger una clase, que puede ser utilizado como tal.

ejemplo:

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) 

El método append parece requerir un objeto de archivo perezoso. Es decir, no lee el archivo de inmediato. Parece esperar hasta que se invoque el método write. Si usa un ámbito abierto (es decir, with), agrega páginas en blanco al archivo resultante, ya que el archivo de entrada está cerrado en ese punto.

La manera más fácil de evitar esto si la duración del identificador de archivo es un problema, es pasar append cadenas de nombre de archivo y permitirle manejar la vida útil del archivo.

decir

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

El pdfrw library puede hacer esto con bastante facilidad, asumiendo que no es necesario para preservar los marcadores y las anotaciones, y sus archivos PDF no están encriptados. cat.py es un script de concatenación de ejemplo, y subset.py es un script de subconjunto de página de ejemplo.

La parte pertinente de la secuencia de comandos concatenación - asume inputs es una lista de nombres de archivos de entrada, y outfn es un nombre de archivo de salida:

from pdfrw import PdfReader, PdfWriter 

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

Como se puede ver en esto, sería muy fácil omita la última página, por ej. algo así como:

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

responsabilidad: yo soy el principal pdfrw autor.

1

Combinar todos los archivos PDF que están presentes en un directorio

poner los archivos PDF en un directorio. Lanzar el programa. Obtienes un pdf con todos los pdfs fusionados.

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) 
Cuestiones relacionadas