Agregar texto a un PDF existente usando Python
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?
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()
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:
- lee tu PDF usando
PdfFileReader()
, llamaremos a esta entrada - cree un nuevo pdf que contenga su texto para agregar usando ReportLab, guárdelo como un objeto de cadena
- lee el objeto de cadena usando
PdfFileReader()
, llamaremos a este texto - cree un nuevo objeto PDF usando
PdfFileWriter()
, llamaremos a esta salida - 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 useoutput.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.