PyPDF2编写的PDF,在Acrobat中打开时显示更改

2024-10-01 15:47:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python和PyPDF2根据带有表单字段的模板生成一组PDF。PDF已创建,所有字段都已正确填写,但当我在Adobe Acrobat中打开PDF时,它们会显示对文件所做的更改(即,“保存”菜单选项已启用,当我尝试关闭文件时,Adobe会询问我是否要保存更改,即使我没有触摸任何内容)

这基本上只是一个小小的烦恼,但有没有办法防止这种情况发生?根据我的研究,这似乎意味着(1)有JavaScript修改文件(没有),或者(2)文件损坏,Adobe正在修复

下面是我的代码的简化版本。我在reader和writer中都将/needAppearancess设置为True,因为否则,除非单击字段,否则这些值不会出现在PDF中。我还设置了注释,以便字段是只读的,并显示为常规文本

from PyPDF2 import PdfFileReader, PdfFileWriter
from PyPDF2.generic import BooleanObject, NameObject, IndirectObject, NumberObject

data = {'field1': 'Text1', 'field2': 'Text2'}

with open('template.pdf', 'rb') as read_file:

    pdf_reader = PdfFileReader(read_file)
    pdf_writer = PdfFileWriter()

    # Set /NeedAppearances to make field values visible
    try:
        if '/AcroForm' in pdf_reader.trailer['/Root']:
            pdf_reader.trailer['/Root']['/AcroForm'][NameObject('/NeedAppearances')] = BooleanObject(True)
        if '/AcroForm' not in pdf_writer._root_object:
            root = pdf_writer._root_object
            acroform = {NameObject('/AcroForm'): IndirectObject(len(pdf_writer._objects), 0, pdf_writer)}
            root.update(acroform)
        root['/AcroForm'][NameObject('/NeedAppearances')] = BooleanObject(True)
    except:
        print('Warning: Error setting PDF /NeedAppearances value.')

    # Add first page to writer
    pdf_writer.addPage(pdf_reader.getPage(0))
    page = pdf_writer.getPage(0)

    # Update form fields
    pdf_writer.updatePageFormFieldValues(page, data)

    # Make fields read-only
    for i in range(len(page['/Annots'])):
        annot = page['/Annots'][i].getObject()
        annot.update({NameObject('/Ff'): NumberObject(1)})

    # Write PDF
    with open('result.pdf', 'wb') as write_file:
        pdf_writer.write(write_file)

Tags: 文件truepdfpagerootreaderfilewriter

热门问题