Python 关于在可编辑PDF文件中填写表单的问题

Python 关于在可编辑PDF文件中填写表单的问题,python,json,ini,pdfrw,Python,Json,Ini,Pdfrw,正如标题所说,我正试图通过Python脚本填充一些PDF字段,下面是我使用的东西: [我的工作环境属性] 0-操作系统:Windows 7 32位 1-Python版本3.8.3 2-一个可编辑的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=5

正如标题所说,我正试图通过Python脚本填充一些PDF字段,下面是我使用的东西:

[我的工作环境属性]

0-操作系统:Windows 7 32位

1-Python版本3.8.3

2-一个可编辑的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检查可编辑的PDF.PDF

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

5-一个Python脚本,用于读取.ini文件并填充可编辑的PDF.PDF字段

事实上,我在大部分方面都取得了成功,除了一件小事让我提出了这个问题,因为老实说,我没有找到解决办法,我还在寻找

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

所以这里的问题是,摘要#字段到底出了什么问题??,是的,说真的,有些东西我不明白,我觉得它很简单

我不想让你为此编写脚本,我至少已经做了一个测试。您所需要的只是将pdfrw库与Python一起安装,以下是脚本:

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[annotu FIELD_key][1:-1])
,它列出了几乎所有字段的名称,除了我要查找的Docked,所以我想这就是为什么它没有填写表格

不管怎样,我用另一种方法解决了这个问题,我发现pdftk可以通过简单的命令行,使用.fdf文件插入.ini,所以是的,目前它是这样解决的

如果您认为pdfrw的问题可以解决,那就好了。 谢谢你的帮助


微笑致意。

您使用的是Windows还是Linux?您是如何获得.ini文件的,它是来自
pdfforms inspect
的输出吗?我已经提到了“0-操作系统:Windows 7 32位”,我使用Windows。我没有得到这个.ini文件,我是使用从.json文件中获得的字段信息创建的,使用这个命令
pdfforms inspect\u PDF.PDF
您使用的是Windows还是Linux?您是如何获得.ini文件的,它是来自
pdfforms inspect
的输出吗?我已经提到了“0-操作系统:Windows 7 32位”,我使用Windows。我没有得到那个.ini文件,我使用了从.json文件中得到的字段信息,使用这个命令
pdfforms inspect\u PDF.PDF