Tekst toevoegen aan bestaande PDF met Python

Ik moet wat extra tekst toevoegen aan een bestaande PDF met Python, wat is de beste manier om dit te doen en welke extra modules zal ik moeten installeren.

OPMERKING: Idealiter zou ik dit kunnen uitvoeren op zowel Windows als Linux, maar bij een Push Linux zal het alleen doen.

EDIT: pypdf en ReportLab ziet er goed uit, maar geen van beide kan ik een bestaande PDF bewerken, zijn er andere opties?


Antwoord 1, Autoriteit 100%

Voorbeeld voor [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()

Voorbeeld voor 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.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()

Antwoord 2, Autoriteit 64%

Ik weet dat dit een oudere post is, maar ik heb lang doorgebracht om een ​​oplossing te vinden. Ik kwam een ​​fatsoenlijke tegen met alleen ReportLab en PYPDF, dus ik dacht dat ik zou delen:

  1. Lees uw PDF met PdfFileReader(), wij noemen dit -invoer
  2. Maak een nieuwe PDF met uw tekst om het toevoegen van ReportLab toe te voegen, sla dit op als een string-object
  3. Lees het string-object met PdfFileReader(), we noemen dit Tekst
  4. Maak een nieuw PDF-object met PdfFileWriter(), we noemen dit -put
  5. itereren via Invoer en solliciteer .mergePage(*text*.getPage(0))Voor elke pagina waar u wilt dat de tekst wordt toegevoegd aan, gebruik vervolgens output.addPage()om de gewijzigde pagina’s toe te voegen aan een nieuw document

Dit werkt goed voor eenvoudige tekstaanbevelingen. Zie het monster van PIPDF voor een document.

Hier is een code om de onderstaande vraag te beantwoorden:

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

Vanaf hier kunt u de pagina’s van het invoerbestand samenvoegen met een ander document.


Antwoord 3, Autoriteit 10%

PDFRW laat je lezen in pagina’s van een bestaande PDF en tekenen ze naar een ReportLab-canvas ( vergelijkbaar met het tekenen van een afbeelding). Er zijn voorbeelden hiervoor in de PDFRW Voorbeelden / RL1 subdirectory op GitHub. DISCLAIMER: Ik ben de PDFRW-auteur.


Antwoord 4, Autoriteit 5%

Leveraging David Dehghan ‘s beantwoorden boven, de volgende werken in 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()

Antwoord 5, Autoriteit 4%

cPDF zal het werk vanaf de command-line te doen. Het is niet python, hoewel (afaik):

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

Antwoord 6

U kunt meer geluk het breken van het probleem naar beneden in het omzetten van PDF naar een bewerkbare indeling, het schrijven van uw wijzigingen, dan is het omzetten van het terug in PDF te hebben. Ik weet niet van een library waarmee je direct bewerken van PDF, maar er zijn tal van converters tussen DOC en PDF bijvoorbeeld.


Antwoord 7

Als je op Windows, dit zou kunnen werken:

PDF Creator Pilot

Er is ook een whitepaper van een PDF-creatie en bewerken kader Python. Het is een beetje gedateerd, maar misschien kunt u enkele nuttige info te geven:

Met behulp van Python als PDF bewerken en verwerken van Framework

Other episodes