如何使用Python在无加密密码时自动填充加密PDF表单
可行性结论
完全可以实现。这类政府PDF模板属于所有者密码加密场景:加密仅限制正文内容编辑、页面调整等操作,开放表单填写权限属于PDF标准明确允许的操作范畴,不需要获取加密密码即可通过Python完成批量填充,填充后的文件保留原加密权限,不会触发机构端的文档合法性校验。
实现方案
目前有两个成熟的Python库可以直接处理这类加密PDF的表单填充,优先推荐pypdf,兼容性覆盖90%以上的标准政府表单模板。
方案1:使用pypdf(原PyPDF2)
这是目前最常用的纯Python PDF处理库,对标准AcroForm格式表单(绝大多数政务模板使用的表单格式)支持完善。
- 安装依赖
pip install pypdf - 第一步先提取模板内的所有表单域名称,不要手动猜字段名,避免填错位置:
from pypdf import PdfReader reader = PdfReader("官方模板.pdf") # 输出所有可填写字段的名称、类型,后续填充用这些名称做key for field_name, field_info in reader.get_fields().items(): print(f"字段名:{field_name},字段类型:{field_info.get('/FT')}") - 批量填充表单代码
from pypdf import PdfReader, PdfWriter # 加载加密模板,不需要传入密码 reader = PdfReader("官方模板.pdf") writer = PdfWriter() # 导入原文档所有页面,自动保留原有加密权限设置 writer.append(reader) # 替换成你实际要填充的内容,key为上一步拿到的字段名 fill_content = { "姓名": "张三", "证件号": "1101011990XXXXXXX", "联系地址": "XX市XX区XX路XX号", # 补充其他需要填写的字段 } # 遍历所有页面更新表单值 for page in writer.pages: writer.update_page_form_field_values(page, fill_content) # 保存填充后的文件 with open("填充完成_1.pdf", "wb") as output_file: writer.write(output_file)
方案2:使用pikepdf(兼容老旧特殊模板)
如果遇到pypdf填充后内容不显示、表单域格式错乱的老旧模板(尤其是部分使用XFA动态表单的老模板),可以换基于qpdf内核的pikepdf处理,对加密权限的兼容性更强。
- 安装依赖
pip install pikepdf - 填充示例代码
import pikepdf # 无密码直接打开加密模板 pdf = pikepdf.open("官方模板.pdf") acro_form = pdf.Root.AcroForm fill_content = { "姓名": "张三", "证件号": "1101011990XXXXXXX", # 同之前的填充内容 } # 遍历字段填充 for field in acro_form.Fields: current_field_name = str(field.T) if current_field_name in fill_content: field.V = fill_content[current_field_name] # 清空原有外观缓存,确保阅读器打开时能正常显示填充内容 field.AP = None pdf.save("填充完成_pikepdf版本.pdf") pdf.close()
注意事项
- 填充前一定要先通过代码导出所有表单域名称,部分模板的字段名是英文/数字编码,和页面上显示的中文标签不一致,手动猜很容易填错
- 保存时不要选择“移除加密”“解密文档”类的操作,保留原文档的权限设置,否则可能导致机构端校验时判定文档被篡改
- 正式批量填充前先拿1-2份测试文件验证,手动打开确认内容位置正确、没有触发编辑限制报错,再跑全量任务
- 如果模板带预留的电子签章/数字签名位,普通表单填充不会破坏签名位有效性,不要修改签名相关的隐藏字段
- 填充后用Adobe Reader打开时提示“文档已修改”属于正常情况,表单填写本身就是模板开放的允许操作,不影响提交。
内容的提问来源于stack exchange,提问作者old_gold_mountain
相关产品推荐
相关产品推荐

