【问题标题】:Update a fillable pdf using PyPDF2使用 PyPDF2 更新可填写的 pdf
【发布时间】:2019-11-17 07:51:23
【问题描述】:

我在更新可填写的 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)

我在调用updatePageFormFieldValues() 之前和之后使用myfile.getFormTextFields() 检查了字段字典,它们确实得到了更新。但是,生成的 pdf 中没有任何字段值。不知道我做错了什么。我正在使用的pdf可以在here找到

【问题讨论】:

    标签: python pdf pypdf2


    【解决方案1】:

    通过将 PDF 的 NeedAppearances 值设置为 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
    

    然后,您可以在writer = PdfFileWriter() 行之后添加set_need_appearances_writer(writer) 行,表单应该会更新!

    您可以在此处查看更多信息: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)
    

    【讨论】:

    • 非常感谢!我绝对不会很快解决这个问题。在遵循您链接的主题后,我遇到了错误并添加了导入 from PyPDF2.generic import BooleanObject, NameObject, IndirectObject
    猜你喜欢
    • 1970-01-01
    • 2017-04-17
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多