PyPDF2报错:'PdfFileReader'对象无'_checkKids'属性求助
解决PyPDF2报错:'PdfFileReader' object has no attribute '_checkKids'
错误原因
你遇到的问题是PyPDF2版本不兼容:_checkKids和_buildField是旧版PyPDF2(1.x系列)的私有内部方法,在新版PyPDF2(2.x及以后)中已被移除或重构,直接调用这些私有方法自然会触发报错。
解决方案
方案1:降级到兼容的旧版PyPDF2
如果想继续沿用当前的代码结构,可以安装1.x系列的稳定版本:
pip uninstall PyPDF2 pip install PyPDF2==1.26.0
方案2:改用新版PyPDF2的官方API(推荐)
新版PyPDF2提供了更简洁的表单字段读取API,无需自己实现复杂的字段解析逻辑。修改你的get_form_fields函数如下:
from PyPDF2 import PdfReader # 新版类名改为PdfReader,替代旧版PdfFileReader from collections import OrderedDict def get_form_fields(infile): reader = PdfReader(open(infile, 'rb')) fields = reader.get_fields() # 转换为你需要的OrderedDict格式,键为字段名,值为字段当前值 return OrderedDict((k, v.get('/V', '')) for k, v in fields.items())
该方法直接调用官方提供的get_fields()接口,避免依赖私有内部方法,兼容性更强。
额外代码问题修正
你的createBrowserScript函数存在缩进错误:遍历items.items()的循环结束后,后续的if判断未缩进在循环内,导致只会处理最后一个字段。修正后的代码片段:
def createBrowserScript(fl, fl_ext, items, pdf_file_name): if pdf_file_name and len(fl) > 0: of = os.path.splitext(pdf_file_name)[0] + '.txt' all_lines = [] for k, v in items.items(): print(k + ' -> ' + v) # 以下代码必须缩进在for循环内,否则仅处理最后一个字段 if (v in ['/Yes', '/On']): all_lines.append(f"document.getElementById('{k}').checked = true;\n") elif (v in ['/0'] and k in fl_ext): all_lines.append(f"document.getElementById('{k}').checked = true;\n") elif (v in ['/No', '/Off', '']): all_lines.append(f"document.getElementById('{k}').checked = false;\n") elif (v in [''] and k in fl_ext): all_lines.append(f"document.getElementById('{k}').checked = false;\n") elif (k in fl): selectListOption(all_lines, k, v) else: all_lines.append(f"document.getElementById('{k}').value = '{v}';\n") # 使用with语句管理文件,避免忘记关闭文件 with open(of, 'w') as outF: outF.writelines(all_lines)
内容的提问来源于stack exchange,提问作者Nicefor
相关产品推荐
相关产品推荐

