web-dev-qa-db-fra.com

Ajouter du texte à existant PDF en utilisant Python

J'ai besoin d'ajouter du texte supplémentaire à un PDF utilisant Python, quelle est la meilleure façon de procéder et quels modules supplémentaires dois-je installer.

Remarque: Idéalement, j'aimerais pouvoir exécuter cela à la fois sur Windows et Linux, mais à un Push Linux seul fera l'affaire.

Modifier: pyPDF et ReportLab bien paraître mais aucun ne me permettra de modifier un PDF existant, y a-t-il d'autres options?

91
Frozenskys

Je sais que c'est un post plus ancien, mais j'ai passé beaucoup de temps à essayer de trouver une solution. Je suis tombé sur un décent en utilisant uniquement ReportLab et PyPDF, donc j'ai pensé partager:

  1. lisez votre PDF en utilisant PdfFileReader(), nous l'appellerons entrée
  2. créer un nouveau pdf contenant votre texte à ajouter à l'aide de ReportLab, l'enregistrer en tant qu'objet chaîne
  3. lire l'objet chaîne en utilisant PdfFileReader(), nous appellerons cela texte
  4. créer un nouvel objet PDF en utilisant PdfFileWriter(), nous l'appellerons sortie
  5. parcourez entrée et appliquez .mergePage(*text*.getPage(0)) pour chaque page à laquelle vous souhaitez ajouter le texte, puis utilisez output.addPage() pour ajouter les pages modifiées à un nouveau document

Cela fonctionne bien pour les ajouts de texte simples. 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)

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

78
dwelch

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()
101
David Dehghan

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

8
Patrick Maupin

En tirant parti de David Dehghanréponse ci-dessus, ce qui suit fonctionne dans 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()
6
Ross Smith II

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

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

Si vous êtes sous Windows, cela pourrait fonctionner:

Pilote PDF Creator

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

tilisation de Python as PDF Framework d'édition et de traitement

0
thedz

Vous aurez peut-être plus de chance de décomposer le problème en convertissant PDF dans 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 PDF mais il existe de nombreux convertisseurs entre DOC et PDF par exemple.

0
aehlke