2010-05-27 17 views
10

Come posizionare un'immagine su un file PDF esistente in una posizione di coordinate specifica. Il pdf rappresenta un foglio di disegno con una pagina. L'immagine sarà ridimensionata. Sto controllando ReportLab ma non riesco a trovare la risposta. Grazie.Posiziona immagine su PDF

+0

L'immagine si verifica sempre nella stessa posizione? –

+0

Sì, è fondamentalmente un francobollo vicino all'angolo in basso a sinistra. –

+0

La risposta è sufficiente? Se no allora cosa c'è di sbagliato in questo? – theheadofabroom

risposta

11

http://pybrary.net/pyPdf/:

from pyPdf import PdfFileWriter, PdfFileReader 

output = PdfFileWriter() 
input1 = PdfFileReader(file("document1.pdf", "rb")) 
watermark = PdfFileReader(file("watermark.pdf", "rb")) 

page4.mergePage(watermark.getPage(0)) 

# finally, write "output" to document-output.pdf 
outputStream = file("document-output.pdf", "wb") 
output.write(outputStream) 
outputStream.close() 

Penso che sia come watermark, consultare il manuale per la migliore idea

+0

Grazie, ha funzionato bene, ha solo accontentato i metodi PdfFileReader.getPage() e PdfFileWriter.addPage() dai documenti. –

+0

si prega di vedere il mio commento sopra. – Auston

+0

Sembra che PyPdf non sia più mantenuto, né il sito continuatore annunciato. Quale altra soluzione esiste nel lungo periodo? – lalebarde

-2

Dal momento che, la sua pdf esistente, il modo più semplice per farlo è:

  1. Converti pdf in .doc o .odt (Controlla http://www.zamzar.com/)
  2. Aggiungi le immagini nel file convertito come vuoi .
  3. riconvertire PDF (OpenOffice e LibreOffice rende facile per salvare i file PDF)

PS: Se il file PDF ha bisogno di cura inoltre sempre tenere una copia di backup di file doc di origine, in modo che i cambiamenti possono essere fatto facilmente, troppa conversione ha effetti negativi sulla qualità del file.

6

Ho combinato ReportLab (http://www.reportlab.com/software/opensource/rl-toolkit/download/) e pyPDF (http://pybrary.net/pyPdf/) per inserire un'immagine direttamente senza avere Per generare il PDF in primo piano:

from pyPdf import PdfFileWriter, PdfFileReader 
from reportlab.pdfgen import canvas 
from StringIO import StringIO 


# Using ReportLab to insert image into PDF 
imgTemp = StringIO() 
imgDoc = canvas.Canvas(imgTemp) 

# Draw image on Canvas and save PDF in buffer 
imgPath = "path/to/img.png" 
imgDoc.drawImage(imgPath, 399, 760, 160, 160) ## at (399,760) with size 160x160 
imgDoc.save() 

# Use PyPDF to merge the image-PDF into the template 
page = PdfFileReader(file("document.pdf","rb")).getPage(0) 
overlay = PdfFileReader(StringIO(imgTemp.getvalue())).getPage(0) 
page.mergePage(overlay) 

#Save the result 
output = PdfFileWriter() 
output.addPage(page) 
output.write(file("output.pdf","w")) 
19

Sono passati 5 anni, penso che queste risposte necessitino di qualche TLC. Ecco una soluzione completa.

effettuano i seguenti controlli con Python 2.7

installare le dipendenze

pip install reportlab 
pip install pypdf2 

fare la magia

from reportlab.pdfgen import canvas 
from PyPDF2 import PdfFileWriter, PdfFileReader 

# Create the watermark from an image 
c = canvas.Canvas('watermark.pdf') 

# Draw the image at x, y. I positioned the x,y to be where i like here 
c.drawImage('test.png', 15, 720) 

# Add some custom text for good measure 
c.drawString(15, 720,"Hello World") 
c.save() 

# Get the watermark file you just created 
watermark = PdfFileReader(open("watermark.pdf", "rb")) 

# Get our files ready 
output_file = PdfFileWriter() 
input_file = PdfFileReader(open("test2.pdf", "rb")) 

# Number of pages in input document 
page_count = input_file.getNumPages() 

# Go through all the input file pages to add a watermark to them 
for page_number in range(page_count): 
    print "Watermarking page {} of {}".format(page_number, page_count) 
    # merge the watermark with the page 
    input_page = input_file.getPage(page_number) 
    input_page.mergePage(watermark.getPage(0)) 
    # add page from input file to output document 
    output_file.addPage(input_page) 

# finally, write "output" to document-output.pdf 
with open("document-output.pdf", "wb") as outputStream: 
    output_file.write(outputStream) 

Riferimenti:

nuova casa di pypdf: http://mstamy2.github.io/PyPDF2/

docs ReportLab: http://www.reportlab.com/apis/reportlab/2.4/pdfgen.html

Reportlab guida per l'uso completa: https://www.reportlab.com/docs/reportlab-userguide.pdf

+2

Mentre si aggiorna la risposta, la libreria [pdfrw] (https://github.com/pmaupin/pdfrw/) può anche [filigrana] (https://github.com/pmaupin/pdfrw/blob /master/examples/watermark.py) in un modo molto simile, e può anche andare nell'altro senso - permettendo di usare PDF preesistenti come se fossero immagini (senza rasterizzarli) in PDF che tu [costruisci con reportlab ] (https://github.com/pmaupin/pdfrw/blob/master/examples/rl1/platypus_pdf_template.py). Disclaimer: I am the pdfrw author ... –

+0

Ah, carino, lo terrò a mente –

0

Questo è ciò che ha funzionato per me

from PyPDF2 import PdfFileWriter, PdfFileReader 

def watermarks(temp, watermar,new_file): 
    template = PdfFileReader(open(temp, 'rb')) 
    wpdf = PdfFileReader(open(watermar, 'rb')) 
    watermark = wpdf.getPage(0) 

    for i in xrange(template.getNumPages()): 
     page = template.getPage(i) 
     page.mergePage(watermark) 
     output.addPage(page) 

     with open(new_file, 'wb') as f: 
      output.write(f) 
1

Thx per le risposte precedenti. A mio modo con python3.4

# -*- coding: utf-8 -*- 
from io import BytesIO 
from PyPDF2 import PdfFileWriter, PdfFileReader 
from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import A4 

def gen_pdf(): 
    # there are 66 slides (1.jpg, 2.jpg, 3.jpg...) 
    path = 'slades/{0}.jpg' 
    pdf = PdfFileWriter() 

    for num in range(1, 67): # for each slide 
     # Using ReportLab Canvas to insert image into PDF 
     imgTemp = BytesIO() 
     imgDoc = canvas.Canvas(imgTemp, pagesize=A4) 
     # Draw image on Canvas and save PDF in buffer 
     imgDoc.drawImage(path.format(num), -25, -45) 
     # x, y - start position 
     # in my case -25, -45 needed 
     imgDoc.save() 
     # Use PyPDF to merge the image-PDF into the template 
     pdf.addPage(PdfFileReader(BytesIO(imgTemp.getvalue())).getPage(0)) 

    pdf.write(open("output.pdf","wb")) 


if __name__ == '__main__': 
    gen_pdf() 
Problemi correlati