reportes pdf2image leer imagen generar convertir python pdf

python - pdf2image - reportlab django



Colocar imagen sobre PDF (7)

¿Cómo puedo colocar una imagen sobre un archivo PDF existente en una ubicación de coordenadas específica? El pdf representa una hoja de dibujo con una página. La imagen será escalada. Estoy revisando ReportLab pero no puedo encontrar la respuesta. Gracias.


Combiné ReportLab (http://www.reportlab.com/software/opensource/rl-toolkit/download/) y pyPDF (http://pybrary.net/pyPdf/) para insertar una imagen directamente sin tener que generar el PDF en la delantera:

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


Dado que, su pdf existente, la forma más fácil de hacerlo es:

  1. Convierta pdf a .doc o .odt ( http://www.zamzar.com/ )
  2. Añade imágenes al archivo convertido como quieras.
  3. Convertir de nuevo a PDF (openoffice y libreoffice facilita guardar archivos PDF)

PD: si el archivo pdf necesita editarse más, siempre mantenga una copia de seguridad del archivo fuente .doc, para que los cambios se puedan hacer fácilmente, demasiada conversión tiene efectos negativos en la calidad del archivo.


Esto es bastante fácil de hacer con PyMuPDF sin combinar dos PDF:

import fitz src_pdf_filename = ''source.pdf'' dst_pdf_filename = ''destination.pdf'' img_filename = ''barcode.jpg'' # http://pymupdf.readthedocs.io/en/latest/rect/ # Set position and size according to your needs img_rect = fitz.Rect(100, 100, 120, 120) document = fitz.open(src_pdf_filename) # We''ll put image on first page only but you could put it elsewhere page = document[0] page.insertImage(img_rect, filename=img_filename) # See http://pymupdf.readthedocs.io/en/latest/document/#Document.save and # http://pymupdf.readthedocs.io/en/latest/document/#Document.saveIncr for # additional parameters, especially if you want to overwrite existing PDF # instead of writing new PDF document.save(dst_pdf_filename) document.close()


Esto es lo que funcionó para mí.

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)


Gracias a las respuestas anteriores. Mi camino 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()


Han pasado 5 años, creo que estas respuestas necesitan un poco de TLC. Aquí hay una solución completa.

Lo siguiente está probado con Python 2.7

Instalar dependencias

pip install reportlab pip install pypdf2

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

Referencias:

Nueva casa de pypdf: http://mstamy2.github.io/PyPDF2/

Documentos de Reportlab: http://www.reportlab.com/apis/reportlab/2.4/pdfgen.html

Guía de usuario completa de Reportlab: https://www.reportlab.com/docs/reportlab-userguide.pdf


http://pybrary.net/pyPdf/ :

from pyPdf import PdfFileWriter, PdfFileReader output = PdfFileWriter() input1 = PdfFileReader(file("document1.pdf", "rb")) watermark = PdfFileReader(file("watermark.pdf", "rb")) input1.mergePage(watermark.getPage(0)) # finally, write "output" to document-output.pdf outputStream = file("document-output.pdf", "wb") output.write(input1) outputStream.close()

Creo que es como una watermark , consulte el manual para una mejor idea