如何将Excel数据自动填充至PDF模板并分页?代码报错求助
问题分析
你的报错根源是search_for方法是在页面上搜索可见文本,但PDF表单字段的名称(比如Text6.0)是后台属性,并非页面上显示的文字,所以搜索结果为空列表,取[0]时触发IndexError。同时原代码逻辑存在冗余(重复加载模板页、修改原模板文件),需要调整。
最简单的解决方案
直接操作PDF表单字段来填充数据,这是最可靠的方式,无需搜索坐标。以下是修正后的代码:
import fitz # PyMuPDF import pandas as pd # 加载PDF模板和Excel数据 pdf_template = fitz.open('Template rev 2.pdf') excel_data = pd.read_excel('Date TEST.xlsx') entries_per_page = 6 # 每页最多6条数据 output_pdf = fitz.open() # 按每页6条的批次处理数据 for start_idx in range(0, len(excel_data), entries_per_page): # 复制模板的第一页作为当前填充页 current_page = pdf_template.load_page(0) # 获取当前页的所有表单字段 form_fields = current_page.widgets() # 填充当前页的字段 for i in range(entries_per_page): data_index = start_idx + i if data_index >= len(excel_data): break # 数据用完就停止填充 # 匹配对应编号和描述字段 number_field = next(w for w in form_fields if w.field_name == f'Text6.{i}') desc_field = next(w for w in form_fields if w.field_name == f'Text8.{i}') # 填充字段值(转成字符串避免类型错误) number_field.field_value = str(excel_data.iloc[data_index]['Number']) desc_field.field_value = str(excel_data.iloc[data_index]['Description']) # 刷新字段,确保值在PDF上可见 number_field.update() desc_field.update() # 将填充好的页面加入输出PDF output_pdf.insert_page(-1, current_page) # 保存最终PDF并关闭文件 output_pdf.save('output.pdf') output_pdf.close() pdf_template.close()
关键说明
- 用
widgets()直接获取页面的表单字段,通过field_name精准匹配你定义的Text6.i和Text8.i,这是定位表单字段的正确方式。 - 每处理6条数据就复制一个模板页,填充完成后加入输出PDF,自动实现分页。
- 必须调用
field.update(),否则填充的值只会存在于表单后台,页面上无法显示。
额外注意
- 如果运行时出现
StopIteration错误,说明你写的字段名称和PDF模板里的真实名称不一致,需要用Adobe Acrobat的表单编辑工具查看字段的准确名称。 - 确认Excel文件的列名确实是
Number和Description,如果不是,要对应修改代码里的列名。
内容的提问来源于stack exchange,提问作者bwood6
相关产品推荐
相关产品推荐

