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

如何用Python便捷地向PDF可填写图片域插入图片?

关于PyPDF与PyMuPDF(fitz)处理PDF表单的实践

我研究了PyPDF和fitz(PyMuPDF)两个库,二者用途各有侧重:

PyPDF:擅长文本表单处理

PyPDF可以轻松获取PDF中的所有可填写文本域:

# 创建PDF读取对象
pdf_reader = pypdf.PdfReader(pdf_file)

# 获取PDF表单对象
pdf_form = pdf_reader.get_form_text_fields()

也能快速填充文本域并保存修改后的PDF:

# 为字段填充目标值
pdf_form['Title'] = 'Value 1'
pdf_form['Subtitle'] = 'Value 2'

# 保存更新后的PDF文件
pdf_writer = pypdf.PdfWriter()
pdf_writer.add_page(pdf_reader.pages[0])
pdf_writer.update_page_form_field_values(pdf_writer.pages[0], pdf_form)
output_file = open('output.pdf', 'wb')
pdf_writer.write(output_file)

但PyPDF不支持图片插入操作。

PyMuPDF(fitz):支持图片插入但定位麻烦

PyMuPDF插入图片的操作相对简洁,比如第三方库fillpdf中的实现:

def place_image(file_name, x, y, input_pdf_path, output_map_path, page_number, width=10, height=10, **kwargs):
    """
    在PDF文档中放置图片。可使用get_coordinate_map函数辅助定位。
    参数
    ---------
    file_name: str
        要插入的图片文件路径
    x: float
        图片左上角的x坐标
    y: float
        图片左上角的y坐标
    input_pdf_path: str
        目标PDF的路径
    output_map_path: str
        生成的新PDF路径
    page_number: float
        要操作的页码
    width: float
        图片宽度
    height: float
        图片高度
    kwargs: Dict
        传递给fitz保存方法的额外参数
    """
    doc = fitz.open(input_pdf_path)
    page = doc[page_number-1]
    
    page.insert_image(fitz.Rect(x, y, x+width, y+height), filename=file_name)
    doc.save(output_map_path, **kwargs)

但手动指定坐标很难精准将图片放到目标位置。fillpdf提供了一个辅助函数来生成坐标参考图:

import math

def get_coordinate_map(input_pdf_path, output_map_path, page_number=1, **kwargs):
    """
    在PDF页面上生成坐标参考图,辅助文本、图片和组件的定位。
    参数
    ---------
    input_pdf_path: str
        目标PDF的路径
    output_map_path: str
        生成的带坐标图的PDF路径
    page_number: float
        要生成坐标图的页码
    kwargs: Dict
        传递给fitz保存方法的额外参数
    返回
    ---------
    表单字段及其填充值的字典
    """
    doc = fitz.open(input_pdf_path)
    page = doc[page_number-1]
    max_x = page.rect[2]
    max_y = page.rect[3]
        
    for y in range(0, int(math.ceil(max_y / 50.0)) * 50, 50): # 每50像素标记一次y轴
        page.insert_text(fitz.Point(0 , y), str(y), fontsize=12, fontname="times-bold", color=(1, 0, 0))
        page.draw_line(fitz.Point(0 , y), fitz.Point(max_x , y), color=(1, 0, 0))
        
    for x in range(0, int(math.ceil(max_x / 50.0)) * 50, 50): # 每50像素标记一次x轴
        page.insert_text(fitz.Point(x , 12), str(x), fontsize=12, fontname="times-bold", color=(1, 0, 0))
        page.draw_line(fitz.Point(x , 12), fitz.Point(x , max_y), color=(1, 0, 0))
    
    doc.save(output_map_path, **kwargs)

这个函数会在PDF页面上绘制带坐标标注的网格线,帮助定位,但还是不够高效。

问题

有没有更简便的方法向PDF的可填写图片域插入图片?我甚至不知道如何通过代码获取图片域的坐标和尺寸,来实现精准放置。


内容的提问来源于stack exchange,提问作者Ariel Vardy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:34:57