Agrega texto a PDF existente usando Python

Necesito agregar un poco de texto adicional a un PDF existente usando Python, cuál es la mejor manera de hacerlo y qué módulos adicionales necesitaré instalar.

Nota: Idealmente, me gustaría poder ejecutar esto tanto en Windows como en Linux, pero solo de forma inmediata, Linux funcionará.

Edición: pyPDF y ReportLab se ven bien, pero ninguno de los dos me permitirá editar un PDF existente, ¿existen otras opciones?

Sé que este es un post más antiguo, pero pasé mucho tiempo tratando de encontrar una solución. Me encontré con uno decente utilizando solo ReportLab y PyPDF, así que pensé en compartir:

  1. lea su PDF usando PdfFileReader() , llamaremos a esta entrada
  2. cree un nuevo pdf que contenga su texto para agregar usando ReportLab, guárdelo como un objeto de cadena
  3. lea el objeto de cadena usando PdfFileReader() , llamaremos a este texto
  4. cree un nuevo objeto PDF usando PdfFileWriter() , llamaremos a esta salida
  5. itere a través de la entrada y aplique .mergePage(*text*.getPage(0)) para cada página a la que desee agregar el texto, luego use output.addPage() para agregar las páginas modificadas a un nuevo documento

Esto funciona bien para simples adiciones de texto. Vea la muestra de PyPDF para marcar un documento con marca de agua.

Aquí hay un código para responder la siguiente pregunta:

 packet = StringIO.StringIO() can = canvas.Canvas(packet, pagesize=letter)  can.save() packet.seek(0) input = PdfFileReader(packet) 

Desde aquí puede combinar las páginas del archivo de entrada con otro documento.

Ejemplo para [Python 2.7]:


 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(10, 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("original.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("destination.pdf", "wb") output.write(outputStream) outputStream.close() 

Ejemplo para Python 3.x:


 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(10, 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("original.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 = open("destination.pdf", "wb") output.write(outputStream) outputStream.close() 

pdfrw te permitirá leer páginas de un PDF existente y dibujarlas en un canvas de reportlab (similar a dibujar una imagen). Hay ejemplos para esto en el subdirectorio pdfrw examples / rl1 en github. Descargo de responsabilidad: soy el autor pdfrw.

Aprovechando la respuesta de David Dehghan anterior, los siguientes trabajos en Python 2.7.13:

 from PyPDF2 import PdfFileWriter, PdfFileReader, PdfFileMerger 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(290, 720, "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("original.pdf") 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 = open("destination.pdf", "wb") output.write(outputStream) outputStream.close() 

cpdf hará el trabajo desde la línea de comandos. Aunque no es python (afaik):

 cpdf -add-text "Line of text" input.pdf -o output .pdf 

Si estás en Windows, esto podría funcionar:

PDF Creator Pilot

También hay un documento técnico de un marco de creación y edición de PDF en Python. Es un poco anticuado, pero quizás pueda darte alguna información útil:

Uso de Python como marco de edición y procesamiento de PDF

Es posible que tenga más suerte al dividir el problema en convertir PDF en un formato editable, escribir los cambios y luego volver a convertirlo en PDF. No conozco una biblioteca que te permita editar PDF directamente, pero hay muchos conversores entre DOC y PDF, por ejemplo.

¿Has probado pyPdf ?

Lo sentimos, no tiene la capacidad de modificar el contenido de una página.