1

正如标题所说,我正在尝试通过 Python 脚本填充一些 PDF 字段,以下是我使用的内容:

[我的工作环境属性]

0 - 操作系统:Windows 7 32 位

1 - Python 版本 3.8.3

2 - 可编辑的 PDF 文件,您可以在此处获取Editable_PDF.pdf

3 - 使用pdfrw库读取和写入 PDF 文件。

4 - 来自外部配置文件的字段名称和值我在这里命名为Field_Value.ini 它是内容

R's #=R: 1111
C's #=C: 2222
R's Address=3333
C's Address=4444
Date Filed=5555
Docket #=6666

如您所见, =之前的第一列是该 PDF 文件的一些字段名称,第二列是要填充的值。

我使用此命令行通过pdfforms实用程序获得了它们

pdfforms inspect Editable_PDF.pdf

它将创建一个.json文件(名为fields.json)包含有关该 PDF 文件中找到的每个字段的信息。

5 - 用于读取该.ini文件并填充Editable_PDF.pdf字段的 Python 脚本。

实际上,我在大部分方面都取得了成功,除了一件小事让我对此提出疑问,因为老实说我没有找到解决方案,我仍在寻找。

问题是Field_Value.ini中列出的所有字段都已填写,除了这个Docket #,无论我做什么都不会填写,有趣的是,如果您尝试通过浏览器或 PDF 编辑器手动填写它,它就会被填写。一开始我以为我可能输入了错误的字段名称,但不,我认为这是正确的,因为无论我填写什么值,我都发现它在fields.json中的名称很方便,与Docket #相同。

所以这里的问题是那个Docket #字段到底出了什么问题???,是的,我真的没有得到它,我觉得它在某种程度上很简单。

我不想让你为此编写脚本,我至少已经完成了一个测试。您所需要的只是使用Python安装pdfrw库,这是脚本:

import pdfrw

PDF_PATH = 'Editable_PDF.pdf'

ANNOT_KEY = '/Annots'
ANNOT_FIELD_KEY = '/T'
ANNOT_VAL_KEY = '/V'
ANNOT_RECT_KEY = '/Rect'
SUBTYPE_KEY = '/Subtype'
WIDGET_SUBTYPE_KEY = '/Widget'

def write_fillable_pdf(input_pdf_path, output_pdf_path, data_dict):
    template_pdf = pdfrw.PdfReader(input_pdf_path)
    annotations = template_pdf.pages[0][ANNOT_KEY]
    for annotation in annotations:
        if annotation[SUBTYPE_KEY] == WIDGET_SUBTYPE_KEY:
            if annotation[ANNOT_FIELD_KEY]:
                key = annotation[ANNOT_FIELD_KEY][1:-1]
                if key in data_dict.keys():
                    annotation.update(
                        pdfrw.PdfDict(V='{}'.format(data_dict[key]))
                    )
    pdfrw.PdfWriter().write(output_pdf_path, template_pdf)

with open("Field_Value.ini", 'r') as file:
    data = file.read()
Array = data.split('\n')
for i in range (0, len(Array)): 
    Field_Value = Array[i].split('=')
    Field = Field_Value[0]
    Value = Field_Value[1]
    print (Field , ' = ' , Value)
    if __name__ == '__main__':
        data_dict = {
            Field: Value
        }
        write_fillable_pdf(PDF_PATH, PDF_PATH, data_dict)
    
pdf_template = pdfrw.PdfReader(PDF_PATH)
pdf_template.Root.AcroForm.update(pdfrw.PdfDict(NeedAppearances=pdfrw.PdfObject('true')))
pdfrw.PdfWriter().write(PDF_PATH, pdf_template)

它可能有点难看,但它可以满足我的需要。我以为你们对此有所了解,所以任何帮助表示赞赏,甚至感谢您花时间阅读它。

编辑:

似乎pdfrw没有以某种方式检测到该字段名称。

我要说的是,我试图在pdfrw像这样处理 PDF 文件时打印出检测到的字段,print (key)或者print (annotation[ANNOT_FIELD_KEY][1:-1])它列出了几乎所有字段名称,除了我要查找的字段名称Docked #,所以我认为这就是为什么它没有不要填写那张表格。

无论如何,我通过使用另一种方式解决了这个问题,我发现pdftk可以通过简单的命令行使用.fdf文件而不是.ini来做到这一点,所以是的,目前它以这种方式解决了。

如果你认为pdfrw的问题可以解决就好了。任何帮助表示赞赏。

微笑问候。

4

0 回答 0