如何用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
相关产品推荐
相关产品推荐

