You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PyPDF2将*.png图片插入PDF文件?现有代码需替换水印源为PNG

如何用PyPDF2插入PNG图片到PDF文件

没问题!你现在的代码是用PDF文件作为水印合并到目标PDF里,但要换成PNG图片的话,PyPDF2本身无法直接读取图片格式——得先把图片转换成PDF页面,或者用PyPDF2的新版本API直接将图片添加到PDF页面中。下面给你两种可行的解决方案:

方案1:先将PNG转为单页PDF再合并(兼容旧版PyPDF2)

这种方法需要借助reportlab库先把PNG生成一个单页PDF,再用你熟悉的合并逻辑处理。

首先安装依赖:

pip install reportlab Pillow

然后修改代码如下:

from PyPDF2 import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
import io

input_file = "example.pdf"
output_file = "example-drafted.pdf"
image_file = "draft.png"

# 第一步:把PNG转成单页PDF
packet = io.BytesIO()
can = canvas.Canvas(packet, pagesize=letter)
# 把图片绘制到PDF画布上,这里默认放在页面左上角,可自行调整坐标
can.drawImage(image_file, 0, 0)
can.save()

# 重置文件指针到开头
packet.seek(0)
image_pdf = PdfReader(packet)
image_page = image_pdf.pages[0]

# 第二步:读取原PDF并合并页面
with open(input_file, "rb") as filehandle_input:
    pdf = PdfReader(filehandle_input)
    first_page = pdf.pages[0]
    # 合并图片页面到原页面(图片会覆盖在原页面上方,若要让原页面在上可调换合并顺序)
    first_page.merge_page(image_page)

    # 准备写入输出文件
    pdf_writer = PdfWriter()
    pdf_writer.add_page(first_page)
    # 若需要保留原PDF的其他页面,循环添加即可
    for page_num in range(1, len(pdf.pages)):
        pdf_writer.add_page(pdf.pages[page_num])

    with open(output_file, "wb") as filehandle_output:
        pdf_writer.write(filehandle_output)

方案2:用新版PyPDF2直接插入图片(推荐)

如果你使用的是PyPDF2 2.0及以上版本,可以直接用PageObject.add_image()方法插入图片,不需要额外生成PDF。

首先确保你的PyPDF2是新版本:

pip install --upgrade PyPDF2

然后修改代码:

from PyPDF2 import PdfReader, PdfWriter
from PyPDF2.generic import RectangleObject

input_file = "example.pdf"
output_file = "example-drafted.pdf"
image_file = "draft.png"

with open(input_file, "rb") as filehandle_input:
    pdf = PdfReader(filehandle_input)
    pdf_writer = PdfWriter()

    # 获取第一页并插入图片
    first_page = pdf.pages[0]
    # 设置图片的位置和尺寸:参数格式为 [左, 下, 右, 上],PDF坐标以左下角为原点
    # 示例将图片放在页面右下角区域,可自行调整数值
    image_rect = RectangleObject([500, 100, 600, 200])
    first_page.add_image(image_file, rect=image_rect)

    pdf_writer.add_page(first_page)
    # 保留原PDF的其他页面
    for page_num in range(1, len(pdf.pages)):
        pdf_writer.add_page(pdf.pages[page_num])

    with open(output_file, "wb") as filehandle_output:
        pdf_writer.write(filehandle_output)

小提示

  • 调整图片位置时,记得PDF的坐标系统是以左下角为原点的,你可以根据需求修改坐标数值来控制图片的位置和大小。
  • 如果需要让图片呈现水印的透明效果,建议先在图片编辑工具中调整PNG的透明度,再进行插入操作。

内容的提问来源于stack exchange,提问作者Jax.ajay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:18:43