Ajouter du texte au PDF existant en utilisant Python

j'ai besoin d'ajouter du texte supplémentaire à un PDF existant en utilisant Python, Quelle est la meilleure façon de procéder et quels modules supplémentaires vais-je avoir besoin d'installer.

Note: idéalement, je voudrais pouvoir exécuter cela à la fois sur Windows et Linux, mais à une poussée Linux seul fera l'affaire.

Edit: pyPDF et ReportLab bonnes, mais ni l'un va me permettre de modifier un PDF existant, existe-il d'autres options?

68
demandé sur zabop 2009-07-25 00:58:31

8 réponses

je sais que c'est un post plus ancien, mais j'ai passé un long moment à essayer de trouver une solution. Je suis tombé sur un bon en utilisant seulement ReportLab et PyPDF donc j'ai pensé que je partagerais:

  1. lisez votre PDF en utilisant PdfFileReader (), nous l'appellerons input
  2. créez un nouveau pdf contenant votre texte à ajouter en utilisant ReportLab, enregistrez ceci comme un objet string
  3. lire la chaîne de caractères de l'objet à l'aide de PdfFileReader(), nous allons appelez cela texte
  4. créez un nouvel objet PDF en utilisant PdfFileWriter (), nous l'appellerons sortie
  5. itérer par entrée et appliquer .mergePage( texte .getPage (0)) pour chaque page à laquelle vous voulez ajouter du texte, Utilisez ensuite sortie .addPage() pour ajouter les pages modifiées dans un nouveau document

Cela fonctionne bien pour ajout de texte simple. Voir l'exemple de PyPDF pour le filigrane d'un document.

voici un code pour répondre à la question ci-dessous:

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

d'ici vous pouvez fusionner les pages du fichier d'entrée avec un autre document

69
répondu dwelch 2010-12-01 16:03:34

exemple pour [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()

exemple pour 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()
77
répondu David Dehghan 2018-03-26 14:10:47

Optimisation David Dehghan 's réponse ci-dessus, les ouvrages suivants, 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()
5
répondu Ross Smith II 2017-05-23 12:02:39

pdfrw vous permettra de lire dans les pages D'un PDF existant et de les dessiner sur une toile reportlab (similaire à un dessin d'une image). Il y a des exemples pour cela dans le sous-répertoire pdfrw examples/rl1 sur github. Avertissement: je suis l'auteur de pdfrw.

4
répondu Patrick Maupin 2015-10-20 23:13:33

cpdf fera le travail à partir de la ligne de commande. Ce n'est pas python, cependant (afaik):

cpdf -add-text "Line of text" input.pdf -o output .pdf
2
répondu user2243670 2014-03-05 11:51:36

si vous êtes sur Windows, cela pourrait fonctionner:

PDF Creator Pilot

il y a aussi un livre blanc d'un cadre de création et d'édition PDF en Python. C'est un peu daté, mais peut-être pouvez-vous donner quelques infos utiles:

utiliser Python comme cadre D'édition et de traitement PDF

1
répondu thedz 2014-09-15 13:01:29

vous pourriez avoir plus de chance de décomposer le problème en convertissant PDF dans un format modifiable, en écrivant vos changements, puis en le convertissant de nouveau en PDF. Je ne connais pas de bibliothèque qui vous permette d'éditer directement PDF mais il y a beaucoup de convertisseurs entre DOC et PDF par exemple.

0
répondu aehlke 2009-07-24 21:03:21

avez-vous essayé pyPdf ?

Désolé, il n'a pas la capacité de modifier le contenu d'une page.

-2
répondu Zoman 2009-07-24 21:13:14