Cómo adjuntar páginas PDF usando PyPDF2

¿Alguien tiene experiencia combinando dos páginas de un archivo PDF en una usando Python lib PyPDF2? Cuando bash page1.mergePage(page2) , aparece page2 superpuesto page1. ¿Cómo hacerlo para agregar page2 al final de la página1?

A medida que busco en la web la solución de fusión de pdf de Python, noté que hay un error general al fusionar en lugar de agregar.

La mayoría de la gente llama a la acción anexa una combinación, pero no lo es. Lo que estás describiendo en tu pregunta es realmente el uso previsto de mergePage que debería llamarse applyPageOnTopOfAnother pero es un poco largo. Lo que estás buscando (en realidad) está agregando dos archivos / páginas en un archivo nuevo.

Anexando archivos PDF

Usando la clase PdfFileMerger y su método de PdfFileMerger .

Idéntico al método merge() , pero se supone que desea concatenar todas las páginas al final del archivo en lugar de especificar una posición.

Aquí hay una forma de hacerlo tomada de pypdf fusionando varios archivos pdf en un pdf :

 from PyPDF2 import PdfFileMerger, PdfFileReader # ... merger = PdfFileMerger() merger.append(PdfFileReader(file(filename1, 'rb'))) merger.append(PdfFileReader(file(filename2, 'rb'))) merger.write("document-output.pdf") 

Anexando páginas PDF específicas

Y para agregar páginas específicas de diferentes archivos PDF, use la clase PdfFileWriter con el método addPage .

Agrega una página a este archivo PDF. La página se adquiere generalmente de una instancia de PdfFileReader .

 file1 = PdfFileReader(file(filename1, "rb")) file2 = PdfFileReader(file(filename2, "rb")) output = PdfFileWriter() output.addPage(file1.getPage(specificPageIndex)) output.addPage(file2.getPage(specificPageIndex)) outputStream = file("document-output.pdf", "wb") output.write(outputStream) outputStream.close() 

Fusionando dos páginas en una sola página

Usando mergePage

Fusiona los flujos de contenido de dos páginas en una sola. Las referencias de recursos (es decir, las fonts) se mantienen desde ambas páginas. La mediabox / cropbox / etc de esta página no se modifica. El flujo de contenido de la página de parámetros se agregará al final del flujo de contenido de esta página, lo que significa que se dibujará después, o “en la parte superior” de esta página.

 file1 = PdfFileReader(file(filename1, "rb")) file2 = PdfFileReader(file(filename2, "rb")) output = PdfFileWriter() page = file1.getPage(specificPageIndex) page.mergePage(file2.getPage(specificPageIndex)) output.addPage(page) outputStream = file("document-output.pdf", "wb") output.write(outputStream) outputStream.close() 

La biblioteca pdfrw puede hacer esto. Hay un ejemplo de 4up en el directorio de ejemplos que coloca 4 páginas de entrada en cada página de salida, y un ejemplo de folleto que toma la entrada de 8.5×11 y crea una salida de 11×17. Descargo de responsabilidad – Soy el autor de pdfrw.

Si los 2 PDF no existen en su máquina local, y en su lugar normalmente se accede a ellos / se descargan a través de una URL (es decir, http: //foo/bar.pdf y http: //bar/foo.pdf ), podemos obtener ambos PDF. desde ubicaciones remotas y fusionarlas en la memoria de una sola vez.

Esto elimina el paso supuesto de descargar el PDF para comenzar, y nos permite generalizar más allá del simple caso de los dos PDF existentes en el disco. Específicamente, generaliza la solución a cualquier PDF accesible mediante HTTP.

El ejemplo:

  from PyPDF2 import PdfFileMerger, PdfFileReader pdf_content_1 = requests.get('http://foo/bar.pdf').content pdf_content_2 = requests.get('http://bar/foo.pdf').content # Write to in-memory file-like buffers pdf_buffer_1 = StringIO.StringIO().write(pdf_content_1) pdf_buffer_2 = StringIO.StringIO().write(pdf_content_2) pdf_merged_buffer = StringIO.StringIO() merger = PdfFileMerger() merger.append(PdfFileReader(pdf_buffer_1)) merger.append(PdfFileReader(pdf_buffer_2)) merger.write(pdf_merged_buffer) # Option 1: # Return the content of the buffer in an HTTP response (Flask example below) response = make_response(pdf_merged_buffer.getvalue()) # Set headers so web-browser knows to render results as PDF response.headers['Content-Type'] = 'application/pdf' response.headers['Content-Disposition'] = \ 'attachment; filename=%s.pdf' % 'Merged PDF' return response # Option 2: Write to disk with open("merged_pdf.pdf", "w") as fp: fp.write(pdf_merged_buffer.getvalue()) 

El código publicado en este siguiente enlace cumplió su objective.

Uso de PyPDF2 para combinar archivos en múltiples archivos de salida

Creo que el truco es:

merger.append (entrada)