PDF 表单填充代码及示例

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表单填充完成!")

重要说明

  1. 表单字段名称:您需要先用PDF编辑器(如Adobe Acrobat)为PDF添加可填写的表单字段,并设置正确的字段名称(如"单位名称"等)。

  2. 字段名称获取:您可以使用以下代码查看PDF中所有表单字段名称:

    from PyPDF2 import PdfFileReader
    
    reader = PdfFileReader("your_form.pdf")
    fields = reader.getFields()
    print(fields.keys())
    
  3. 非交互式PDF:如果您无法编辑PDF添加表单字段,则需要考虑使用其他方法,如:

    • 使用PDF模板库(如reportlab)从头创建PDF
    • 使用OCR识别文本位置并覆盖文本
    • 使用PDF编辑工具预先添加表单字段
  4. 中文支持:确保您的PDF字体支持中文字符,否则填充的内容可能无法正确显示。

希望这个解决方案对您有所帮助!如果您需要针对非交互式PDF的解决方案,请告知,我可以提供其他方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值