代码之家  ›  专栏  ›  技术社区  ›  West

使用PyPDF2更新可填充pdf

  •  0
  • West  · 技术社区  · 5 年前

    我在更新可填充pdf中的命名字段时遇到问题。 我的代码如下所示:

    from PyPDF2 import PdfFileWriter, PdfFileReader
    
    myfile = PdfFileReader("invoice_template.pdf")
    first_page = myfile.getPage(0)
    
    writer = PdfFileWriter()
    
    data_dict = {
                'business_name_1': 'Consulting',
                'customer_name': 'company.io',
                'customer_email': 'example@icloud.com'
                }
    
    writer.updatePageFormFieldValues(first_page, fields=data_dict)
    writer.addPage(first_page)
    
    with open("newfile.pdf","wb") as new:
        writer.write(new)
    

    我用 myfile.getFormTextFields() 打电话前后 updatePageFormFieldValues() 他们会得到更新。但是,生成的pdf中没有任何字段值。不知道我做错了什么。我使用的pdf文件可以找到 here

    1 回复  |  直到 5 年前
        1
  •  1
  •   West    5 年前

    通过设置 NeedAppearances PDF的值 True . 这可以通过一个函数来完成:

    def set_need_appearances_writer(writer: PdfFileWriter):
        # See 12.7.2 and 7.7.2 for more information: http://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf
        try:
            catalog = writer._root_object
            # get the AcroForm tree
            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)
            # del writer._root_object["/AcroForm"]['NeedAppearances']
            return writer
    
        except Exception as e:
            print('set_need_appearances_writer() catch : ', repr(e))
            return writer
    

    然后,你可以添加 set_need_appearances_writer(writer) 排在队伍后面 writer = PdfFileWriter() 表格应该更新!

    您可以在此处查看更多信息: https://github.com/mstamy2/PyPDF2/issues/355

    固定代码

    from PyPDF2 import PdfFileWriter, PdfFileReader
    from PyPDF2.generic import BooleanObject, NameObject, IndirectObject
    
    def set_need_appearances_writer(writer: PdfFileWriter):
        # See 12.7.2 and 7.7.2 for more information: http://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf
        try:
            catalog = writer._root_object
            # get the AcroForm tree
            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)
            # del writer._root_object["/AcroForm"]['NeedAppearances']
            return writer
    
        except Exception as e:
            print('set_need_appearances_writer() catch : ', repr(e))
            return writer
    
    myfile = PdfFileReader("invoice_template.pdf")
    first_page = myfile.getPage(0)
    
    writer = PdfFileWriter()
    set_need_appearances_writer(writer)
    
    data_dict = {
                'business_name_1': 'Consulting',
                'customer_name': 'company.io',
                'customer_email': 'example@icloud.com'
                }
    
    writer.updatePageFormFieldValues(first_page, fields=data_dict)
    writer.addPage(first_page)
    
    with open("newfile.pdf","wb") as new:
        writer.write(new)