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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:56:21