2011-07-25 395 views
5

Estoy tratando de convertir un pdf al mismo tamaño que mi pdf que es una página A4. Agregar texto al documento PDF existente en Python

convert my_pdf.pdf -density 300x300 -page A4 my_png.png 

el archivo PNG resultante, sin embargo, es 595px × 842px que debería ser la resolución a 72 ppp. Estaba pensando en utilizar PIL para escribir algunos textos en algunos de los campos de PDF y convertirlos de nuevo a PDF. Pero actualmente la imagen sale mal.

Editar: Me estaba acercando al problema desde el ángulo equivocado. El enfoque correcto no incluía imagemagick en absoluto.

+2

¿Está convirtiendo un archivo de texto a un archivo de imagen para escribirle un texto y convertirlo a un formato híbrido de imagen/texto? No hay forma__ de que sea la mejor manera de anotar un '.pdf' o completar un formulario' .pdf'. – agf

+0

Probablemente tengas razón. Parece que no puedo encontrar una forma adecuada de modificar un pdf existente en python:/ –

+0

posible duplicado de [Agregar texto a PDF existente usando Python] (http://stackoverflow.com/questions/1180115/add-text-to-existing -pdf-using-python) – bain

Respuesta

2

Debería mirar Add text to Existing PDF using Python y también Python as PDF Editing and Processing Framework. Estos lo señalarán en la dirección correcta.

Si hace lo que ha propuesto en la pregunta, cuando exporte de nuevo a .pdf, realmente solo será un archivo de imagen incrustado en .pdf, no será texto.

+0

Acepté su respuesta ya que me hizo volver a leer esa publicación (primer enlace) y eso me llevó a la solución. Gracias. –

+0

I + 1 porque ahora tengo un script de trabajo conocido para cuando necesito hacerlo yo mismo :) – agf

21

Después de buscar algo encontré finalmente la solución: Resultó que this era el enfoque correcto después de todo. Sin embargo, siento que no fue suficientemente detallado. Parece que el póster probablemente lo tomó de here (los mismos nombres de variables, etc.).

La idea: crear un nuevo PDF en blanco con Reportlab que solo contenga una cadena de texto. Luego fusione/agréguelo como marca de agua usando pyPdf.

from pyPdf import PdfFileWriter, PdfFileReader 
import StringIO 
from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import letter 
packet = StringIO.StringIO() 
# create a new PDF with Reportlab 
can = canvas.Canvas(packet, pagesize=letter) 
can.drawString(100,100, "Hello world") 
can.save() 

#move to the beginning of the StringIO buffer 
packet.seek(0) 
new_pdf = PdfFileReader(packet) 
# read your existing PDF 
existing_pdf = PdfFileReader(file("mypdf.pdf", "rb")) 
output = PdfFileWriter() 
# add the "watermark" (which is the new pdf) on the existing page 
page = existing_pdf.getPage(0) 
page.mergePage(new_pdf.getPage(0)) 
output.addPage(page) 
# finally, write "output" to a real file 
outputStream = file("/home/joe/newpdf.pdf", "wb") 
output.write(outputStream) 
outputStream.close() 

Espero que esto ayude a alguien más.

5

Acabo de probar la solución anterior, pero tuve algunos problemas para ejecutar Python3. Entonces, me gustaría compartir mis modificaciones. El código adaptado tiene el siguiente aspecto:

from PyPDF2 import PdfFileWriter, PdfFileReader 
import io 
from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import letter 

packet = io.BytesIO() 

# create a new PDF with Reportlab 
can = canvas.Canvas(packet, pagesize=letter) 
can.drawString(100, 100, "Hello world") 
can.save() 

# move to the beginning of the StringIO buffer 
packet.seek(0) 
new_pdf = PdfFileReader(packet) 
# read your existing PDF 
existing_pdf = PdfFileReader(open("mypdf.pdf", "rb")) 
output = PdfFileWriter() 
# add the "watermark" (which is the new pdf) on the existing page 
page = existing_pdf.getPage(0) 
page2 = new_pdf.getPage(0) 
page.mergePage(page2) 
output.addPage(page) 
# finally, write "output" to a real file 
outputStream = open("newpdf.pdf", "wb") 
output.write(outputStream) 
outputStream.close() 

Ahora la page.mergePage arroja un error. Resulta ser un error de portabilidad en pypdf2. Consulte esta pregunta para la solución: Porting to Python3: PyPDF2 mergePage() gives TypeError

2

pdfrw le permitirá tomar archivos PDF existentes y colocarlos como objetos XObjects (similar a las imágenes) en un lienzo de informe. Hay algunos ejemplos para esto en el subdirectorio pdfrw examples/rl1 en github. Descargo de responsabilidad: soy el autor de pdfrw.

Cuestiones relacionadas