PDF 表单填充代码及示例
根据您提供的参考代码和PDF文件内容,我将提供一个完整的PDF表单填充解决方案。首先,我需要指出您提供的PDF文件似乎是一个扫描件或图像PDF,而不是可填写的PDF表单(没有交互式表单字段)。对于这种情况,您需要先使用PDF编辑器创建可填写的表单字段。
解决方案
以下是完整的PDF表单填充代码,适用于可填写的PDF表单:
from PyPDF2 import PdfFileReader, PdfFileWriter
from PyPDF2.generic import NameObject, BooleanObject, IndirectObject, TextStringObject, NumberObject
def set_need_appearances_writer(writer):
"""
确保PDF填写的内容可见
"""
try:
catalog = writer._root_object
if "/AcroForm" not in catalog:
writer._root_object.update({
NameObject("/AcroForm"): IndirectObject(len(writer._objects), 0, writer)
})
need_appearances = NameObject("/NeedAppearances")
writer._root_object["/AcroForm"][need_appearances] = BooleanObject(True)
except Exception as e:
print(f"设置NeedAppearances时出错: {str(e)}")
def fill_pdf_form(input_pdf_path, output_pdf_path, form_data):
"""
填充PDF表单
:param input_pdf_path: 输入PDF路径
:param output_pdf_path: 输出PDF路径
:param form_data: 表单数据字典,键为字段名,值为要填充的内容
"""
# 读取PDF文件
pdf_reader = PdfFileReader(open(input_pdf_path, "rb"), strict=False)
pdf_writer = PdfFileWriter()
# 设置NeedAppearances以确保填写内容可见
set_need_appearances_writer(pdf_writer)
# 添加第一页
pdf_writer.addPage(pdf_reader.getPage(0))
page = pdf_writer.getPage(0)
# 获取表单字段
if "/Annots" not in page:
raise ValueError("PDF中没有可填写的表单字段")
# 填充表单数据
for j in range(len(page['/Annots'])):
writer_annot = page['/Annots'][j].getObject()
# 检查字段是否有父级
if '/Parent' in writer_annot:
writer_annot_parent = writer_annot['/Parent'].getObject()
for field in form_data:
if writer_annot_parent.get('/T') == field:
writer_annot_parent.update({
NameObject("/V"): TextStringObject(form_data[field]),
NameObject("/Ff"): NumberObject(1)
})
else:
for field in form_data:
if writer_annot.get('/T') == field:
writer_annot.update({
NameObject("/V"): TextStringObject(form_data[field]),
NameObject("/Ff"): NumberObject(1)
})
# 写入输出文件
with open(output_pdf_path, "wb") as output_stream:
pdf_writer.write(output_stream)
使用示例
假设您的PDF表单有以下字段名称(您需要先用PDF编辑器创建这些字段):
- “单位名称”
- “单位性质”
- “地址”
- “成立时间”
- “经营期限”
- “姓名”
- “身份证号”
使用示例:
# 表单数据
form_data = {
"单位名称": "北京测试科技有限公司",
"单位性质": "有限责任公司",
"地址": "北京市海淀区科技园路1号",
"成立时间": "2010年5月20日",
"经营期限": "长期",
"姓名": "张三",
"身份证号": "110101199001011234"
}
# 填充PDF表单
fill_pdf_form(
input_pdf_path="计量器具技术服务竞标采购文件CHange1_27.pdf",
output_pdf_path="filled_form.pdf",
form_data=form_data
)
print("PDF表单填充完成!")
重要说明
-
表单字段名称:您需要先用PDF编辑器(如Adobe Acrobat)为PDF添加可填写的表单字段,并设置正确的字段名称(如"单位名称"等)。
-
字段名称获取:您可以使用以下代码查看PDF中所有表单字段名称:
from PyPDF2 import PdfFileReader reader = PdfFileReader("your_form.pdf") fields = reader.getFields() print(fields.keys())
-
非交互式PDF:如果您无法编辑PDF添加表单字段,则需要考虑使用其他方法,如:
- 使用PDF模板库(如reportlab)从头创建PDF
- 使用OCR识别文本位置并覆盖文本
- 使用PDF编辑工具预先添加表单字段
-
中文支持:确保您的PDF字体支持中文字符,否则填充的内容可能无法正确显示。
希望这个解决方案对您有所帮助!如果您需要针对非交互式PDF的解决方案,请告知,我可以提供其他方法。