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

