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:
- Convierta pdf a .doc o .odt ( http://www.zamzar.com/ )
- Añade imágenes al archivo convertido como quieras.
- 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
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