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?
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:
PdfFileReader()
, nous l'appellerons entréePdfFileReader()
, nous appellerons cela textePdfFileWriter()
, nous l'appellerons sortie.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 documentCela 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.
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()
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()
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.
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()
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
Si vous êtes sous Windows, cela pourrait fonctionner:
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
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.