168 votes

Ajouter du texte à un PDF existant à l'aide de Python

Je dois 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 dois-je installer ?

Note : Idéalement, j'aimerais pouvoir exécuter ce programme à la fois sous Windows et sous Linux, mais pour l'instant, seul Linux fera l'affaire.

Edit : pyPDF et ReportLab semblent bons mais aucun ne me permet de modifier un PDF existant, y a-t-il d'autres options ?

185voto

David Dehghan Points 1047

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

18 votes

Pour python3, le paquet devrait être io.BytesIO et utiliser PyPDF2 plutôt que pyPDF (qui n'est pas maintenu). Excellente réponse !

5 votes

Merci de partager. Cela fonctionne très bien. Une remarque : je crois qu'il est préférable d'utiliser open au lieu de file .

1 votes

Je pense que cette réponse est plus acceptable, d'autant plus qu'elle comprend un exemple concret.

107voto

dwelch Points 1101

Je sais que c'est un vieux post, mais j'ai passé beaucoup de temps à essayer de trouver une solution. Je suis tombé sur une solution décente utilisant uniquement ReportLab et PyPDF, alors j'ai pensé que je devais partager :

  1. lire votre PDF en utilisant PdfFileReader() nous l'appellerons entrée
  2. créez un nouveau pdf contenant votre texte à ajouter à l'aide de ReportLab, sauvegardez-le en tant qu'objet de type chaîne.
  3. lire l'objet chaîne de caractères en utilisant PdfFileReader() nous l'appellerons texte
  4. créer un nouvel objet PDF en utilisant PdfFileWriter() nous l'appellerons sortie
  5. itérer dans entrée et appliquer .mergePage(*text*.getPage(0)) pour chaque page à laquelle vous voulez ajouter le texte, puis utilisez output.addPage() pour ajouter les pages modifiées à un nouveau document

Cela fonctionne bien pour les simples ajouts de texte. Voir l'exemple de PyPDF pour le filigrane d'un document.

Voici du 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)

À partir de là, vous pouvez fusionner les pages du fichier d'entrée avec un autre document.

2 votes

"créez un nouveau pdf contenant votre texte à ajouter en utilisant ReportLab, sauvegardez-le en tant qu'objet chaîne" Comment faites-vous cela ? C'est une instance de canevas.

1 votes

J'ai ajouté un exemple de code ci-dessus pour répondre à la question de Lakshman.

1 votes

Je recommande d'utiliser PyPDF2 car il est plus à jour, et de consulter leur code d'exemple : github.com/mstamy2/PyPDF2/blob/

8voto

user2243670 Points 1

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

0 votes

Merci. C'est un très bel outil.

-2voto

thedz Points 3494

Si vous êtes sous Windows, cela peut fonctionner :

PDF Creator Pilot

Il y a aussi un livre blanc sur un cadre de création et d'édition de PDF en Python. Il date un peu, mais vous pourrez peut-être y trouver des informations utiles :

Utilisation de Python comme cadre d'édition et de traitement des PDF

0 votes

Le livre blanc a l'air bien, mais il est un peu léger en termes de code, et je n'ai pas vraiment les ressources nécessaires pour mettre en œuvre un cadre PDF complet moi-même ;)

-4voto

aehlke Points 4180

Vous aurez peut-être plus de chance en décomposant le problème en convertissant le PDF en un format modifiable, en écrivant vos modifications, puis en le reconvertissant en PDF. Je ne connais pas de bibliothèque qui vous permette de modifier directement le PDF, mais il existe de nombreux convertisseurs entre DOC et PDF, par exemple.

2 votes

Le problème est que je n'ai que la source en PDF (d'une tierce partie) et PDF -> DOC -> PDF perdra beaucoup dans la conversion. De plus, j'ai besoin que ce projet fonctionne sous Linux, donc DOC n'est peut-être pas le meilleur choix.

0 votes

Je crois qu'Adobe garde la capacité d'édition de PDF assez fermée et propriétaire afin de pouvoir vendre des licences pour ses meilleures versions d'Acrobat. Peut-être pouvez-vous trouver un moyen d'automatiser l'utilisation d'Acrobat Pro pour l'éditer, en utilisant une sorte d'interface macro.

0 votes

Si les parties dans lesquelles vous voulez écrire sont des champs de formulaire, il existe des interfaces XML pour les modifier - sinon, je ne trouve rien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X