Agregar texto a un PDF existente usando Python

Resuelto Frozenskys asked hace 15 años • 9 respuestas

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

Nota: Lo ideal sería poder ejecutar esto tanto en Windows como en Linux, pero si lo presionas, solo Linux funcionará.

Editar: pypdf y ReportLab se ven bien pero ninguno me permite editar un PDF existente, ¿hay otras opciones?

Frozenskys avatar Jul 25 '09 03:07 Frozenskys
Aceptado

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()
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)

# create a new PDF with Reportlab
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()
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)

# create a new PDF with Reportlab
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.pages[0]
page.merge_page(new_pdf.pages[0])
output.add_page(page)
# finally, write "output" to a real file
output_stream = open("destination.pdf", "wb")
output.write(output_stream)
output_stream.close()
David Dehghan avatar Jul 09 '2013 00:07 David Dehghan

Sé que esta es una publicación anterior, pero pasé mucho tiempo tratando de encontrar una solución. Encontré uno decente usando solo ReportLab y PyPDF, así que pensé en compartirlo:

  1. lee tu 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. lee 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 desea agregar el texto, luego use output.addPage()para agregar las páginas modificadas a un nuevo documento

Esto funciona bien para adiciones de texto simples. Vea el ejemplo de PyPDF para poner una marca de agua en un documento.

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

packet = StringIO.StringIO()
can = canvas.Canvas(packet, pagesize=letter)
<do something with canvas>
can.save()
packet.seek(0)
input = PdfFileReader(packet)

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

dwelch avatar Feb 01 '2010 23:02 dwelch