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

使用PyPDF2填充PDF表单遇TypeError: '_VirtualList'对象不可调用求助

PyPDF2填充PDF表单报错解决方法

错误原因

报错TypeError: '_VirtualList' object is not callable的直接原因是代码错误地将pdf_reader.pages当作函数调用:

page = pdf_reader.pages(page_num)

实际上pdf_reader.pages是序列对象,必须通过索引访问(方括号[])获取指定页面。

修正后的完整代码

import PyPDF2

# 使用with语句自动管理文件,无需手动调用close
with open('Update Form - Final fill.pdf', 'rb') as pdf_file:
    pdf_reader = PyPDF2.PdfReader(pdf_file)
    pdf_writer = PyPDF2.PdfWriter()

    # 遍历所有页面
    for page_num in range(len(pdf_reader.pages)):
        # 修正:用索引获取页面
        page = pdf_reader.pages[page_num]
        
        # 填充表单字段
        if page.get('/Annots'):
            for annot in page['/Annots']:
                annot_obj = annot.get_object()
                if annot_obj.get('/T'):
                    # 获取字段名称,去除首尾括号
                    key = annot_obj.get('/T')[1:-1]
                    if key == 'date':
                        annot_obj.update({
                            '/V': '(Your date)'
                        })
                    elif key == 'form#':
                        annot_obj.update({
                            '/V': '(form number)'
                        })
                    elif key == 'handler':
                        annot_obj.update({
                            '/V': '(our handler)'
                        })
        
        # 兼容新旧版本PyPDF2的页面添加方法
        try:
            pdf_writer.add_page(page)
        except AttributeError:
            pdf_writer.addPage(page)

    # 保存填充后的PDF
    with open('filled_form.pdf', 'wb') as filled_pdf:
        pdf_writer.write(filled_pdf)

额外注意事项

  • 确保代码中的字段名称(date、form#、handler)与PDF表单中的实际字段名完全一致,包括大小写、特殊符号。
  • 若填充后字段无法编辑,可尝试给annot_obj.update的字典添加'/Ff': 4属性(允许字段编辑)。
  • 建议使用PyPDF2最新版本,避免旧版本的API兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:40:33