在PDF上放置图像

36 投票
6 回答
56075 浏览
提问于 2025-04-15 23:16

我想知道怎么把一张图片放到一个已有的PDF文件上,放在特定的坐标位置。这个PDF文件是一个只有一页的图纸。图片需要缩放一下。我在查找ReportLab的资料,但找不到答案。谢谢。

6 个回答

14

我把ReportLabpypdf<3.0.0结合起来,这样就可以直接插入图片,而不需要事先生成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"))
53

已经过去五年了,我觉得这些回答需要一些关心和更新。这里有一个完整的解决方案。

以下内容是在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项目页面: https://pypi.org/project/pypdf/

Reportlab文档: http://www.reportlab.com/apis/reportlab/2.4/pdfgen.html

Reportlab完整用户指南: https://www.reportlab.com/docs/reportlab-userguide.pdf

29

https://pypi.org/project/pypdf/:

from pypdf import PdfWriter, PdfReader

writer = PdfWriter()
reader = PdfReader("document1.pdf")
watermark = PdfReader("watermark.pdf")

page = reader.pages[0]
page.merge_page(watermark.pages[0])
writer.add_page(page)

# finally, write the results to disk
with open("document-output.pdf", "wb") as fp:
    writer.write(fp)

我觉得这就像是水印,想了解更多信息可以查看文档。

撰写回答