Поместить изображение поверх PDF - PullRequest
28 голосов
/ 28 мая 2010

Как я могу поместить изображение поверх существующего файла PDF в определенном месте координат PDF представляет собой чертежный лист с одной страницей. Изображение будет масштабировано. Я проверяю ReportLab, но не могу найти ответ. Спасибо.

Ответы [ 7 ]

32 голосов
/ 29 июля 2015

Прошло 5 лет, я думаю, что эти ответы требуют некоторого TLC. Вот полное решение.

Следующие тестируются с Python 2.7

Установить зависимости

pip install reportlab 
pip install pypdf2

сотвори волшебство

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)

Ссылки:

Новый дом pypdf: http://mstamy2.github.io/PyPDF2/

Отчетная документация: http://www.reportlab.com/apis/reportlab/2.4/pdfgen.html

Reportlab полное руководство пользователя: https://www.reportlab.com/docs/reportlab-userguide.pdf

18 голосов
/ 16 марта 2011

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

Я думаю, что это похоже на watermark, см. Руководство для лучшей идеи

10 голосов
/ 26 мая 2012

Я объединил ReportLab (http://www.reportlab.com/software/opensource/rl-toolkit/download/) и pyPDF (http://pybrary.net/pyPdf/)), чтобы вставить изображение напрямую, без предварительного создания PDF-файла:

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"))
3 голосов
/ 05 февраля 2016

Спасибо за предыдущие ответы. Мой путь с 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()
1 голос
/ 21 мая 2018

Это довольно легко сделать с PyMuPDF без объединения двух 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()
0 голосов
/ 29 октября 2015

Вот что у меня сработало

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)
0 голосов
/ 22 марта 2011

Так как, из существующего pdf, самый простой способ сделать это:

  1. Конвертировать pdf в .doc или .odt (Проверьте http://www.zamzar.com/)
  2. Добавляйте изображения в преобразованный файл по своему усмотрению.
  3. Преобразование обратно в PDF (openoffice и libreoffice упрощают сохранение PDF-файлов)

PS: если файл PDF необходимо отредактироватьвсегда сохраняйте резервную копию исходного файла .doc, чтобы изменения можно было легко выполнить, слишком большое преобразование плохо сказывается на качестве файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...