使用PyPDF2更新可填充的pdf

问题描述 投票:0回答:1

我在更新可填充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': '[email protected]'
            }

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

python pdf pypdf2
1个回答
1
投票
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': '[email protected]' } writer.updatePageFormFieldValues(first_page, fields=data_dict) writer.addPage(first_page) with open("newfile.pdf","wb") as new: writer.write(new)

© www.soinside.com 2019 - 2024. All rights reserved.