2009-07-24 27 views
60

Ho bisogno di aggiungere del testo extra a un PDF esistente usando Python, qual è il modo migliore per farlo e quali moduli extra dovrò installare.Aggiungere testo a PDF esistente usando Python

Nota: Idealmente, mi piacerebbe essere in grado di eseguirlo sia su Windows che su Linux, ma con una semplice spinta Linux lo farà.

Grazie in anticipo.
Richard.

Modifica: pyPDF e ReportLab hanno un bell'aspetto ma nessuno dei due mi consentirà di modificare un PDF esistente, ci sono altre opzioni?

risposta

63

So che questo è un posto più vecchio, ma ho trascorso molto tempo cercando di trovare una soluzione. Mi sono imbattuto in una decente utilizzando solo ReportLab e PyPDF così ho pensato di condividere:

  1. letto il tuo PDF utilizzando PdfFileReader(), che chiameremo questo ingresso
  2. creare un nuovo PDF contenente il testo da aggiungere utilizzando ReportLab, salvare questo come un oggetto stringa
  3. leggere l'oggetto stringa utilizzando PdfFileReader(), che chiameremo questo testo
  4. creare un nuovo oggetto PDF utilizzando PdfFileWriter(), che chiameremo questo output
  5. Scorrere ingresso e applicare .mergePage (testo .getPage (0)) per ogni pagina che si desidera che il testo aggiunto, quindi utilizzare uscita .addPage() per aggiungere le pagine modificate in un nuovo documento

Questo funziona bene per le aggiunte di testo semplice. Guarda l'esempio di PyPDF per filigranare un documento.

Ecco il codice per rispondere alla domanda qui sotto:

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

Da qui è possibile unire le pagine del file di input con un altro documento

+1

"crea un nuovo pdf contenente il testo da aggiungere utilizzando ReportLab, salva questo come oggetto stringa" Come si fa? È un'istanza di canvas. –

+1

Ho aggiunto qualche codice di esempio sopra per rispondere alla domanda di Lakshman. – dwelch

+1

Questa risposta è d'oro - funziona come un fascino. –

0

Potresti avere più fortuna nel risolvere il problema convertendo il PDF in un formato modificabile, scrivendo le tue modifiche e poi riconvertendole in PDF. Non conosco una libreria che ti permetta di modificare direttamente il PDF, ma ci sono molti convertitori tra DOC e PDF per esempio.

+1

problema è che ho solo la sorgente in formato PDF (da un 3rd party) e PDF -> DOC -> PDF perderà molto nella conversione. Inoltre ho bisogno di questo per funzionare su Linux, quindi DOC potrebbe non essere la scelta migliore. – Frozenskys

+0

Credo che Adobe mantenga le capacità di editing PDF piuttosto chiuse e proprietarie in modo che possano vendere le licenze per le loro versioni migliori di Acrobat. Forse puoi trovare un modo per automatizzare l'uso di Acrobat Pro per modificarlo, usando un qualche tipo di interfaccia macro. – aehlke

+0

Se le parti in cui si desidera scrivere sono campi modulo, ci sono interfacce XML per modificarle, altrimenti non riesco a trovare nulla. – aehlke

-2

Hai provato pyPdf?

Siamo spiacenti, non ha la possibilità di modificare il contenuto di una pagina.

+0

Sembra che potrebbe funzionare, qualcuno l'ha usato? Come si usa la memoria? – Frozenskys

+0

Ha la possibilità di aggiungere una filigrana di testo e se è stata formattata correttamente potrebbe funzionare. – Frozenskys

1

Se siete su Windows, questo potrebbe funzionare:

PDF Creator Pilot

C'è anche un white paper di una creazione di PDF e la modifica quadro in Python. E 'un po' datato, ma forse può dare alcune informazioni utili:

Using Python as PDF Editing and Processing Framework

+0

Il white paper sembra buono ma è un po 'di luce sul codice, e non ho la vera risorsa per implementare un intero framework PDF da solo! ;) – Frozenskys

68

Ecco una risposta completa che ho trovato altrove [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() 

E qui è un aggiornamento per 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() 
+8

Per python3, il pacchetto deve essere 'io.BytesIO' e usare PyPDF2 piuttosto che pyPDF (che non è mantenuto). Bella risposta! –

+3

Grazie per aver condiviso. Funziona alla grande. Una nota: credo che sia meglio usare 'open' invece di' file'. – mitenka

+0

Credo che questa sia una risposta più accettabile, soprattutto perché include un esempio funzionante. – Casey

2

cpdf farà il lavoro dalla riga di comando. Non è python, anche se (per quanto ne so):

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

pdfrw ti consente di leggere nelle pagine da un PDF esistente e li disegna a una tela ReportLab (simile a disegnare un'immagine). Ci sono degli esempi per questo nella sottodirectory pdfrw examples/rl1 su github. Disclaimer: sono l'autore di pdfrw.

+0

Penso che potresti mettere un link lì – The6thSense

+0

Buon punto! Non avevo fatto molto SO quando l'ho pubblicato, ed ero preoccupato per il "testo minimo più la politica di collegamento". (Il mio rappresentante aveva solo 46 anni al momento, e IIRC avevo appena ricevuto un -2 in una risposta, quindi ero un po 'preoccupato per le nuove risposte sulle domande di 5 anni :) –

+0

vecchie domande ottengono più vista :) e attenzione – The6thSense

3

Sfruttando David Dehghan s' answer sopra, le seguenti opere 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() 
Problemi correlati