正如标题所说,我正在尝试通过 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的问题可以解决就好了。任何帮助表示赞赏。
微笑问候。