0

我希望能够用 Python 填写 PDF。PDF 正在使用 pdfrw 库创建。当我在创建它后尝试打开它时,没有显示表单字段。

# Read the source
template_pdf = pdfrw.PdfReader(pdfSrc)

# Adding the default pages
out_pdf = pdfrw.PdfWriter()
out_pdf.addPage(template_pdf.getPage(0))
out_pdf.addPage(template_pdf.getPage(1))

# Add third or more pages (as needed)
if (nbPagesMore > 0) :
    for j in range(nbPagesMore) :
        out_pdf.addPage(template_pdf.getPage(2))
else : 
    out_pdf.addPage(template_pdf.getPage(2))

f = tempfile.NamedTemporaryFile(delete=False, suffix='.pdf')
f.close()

# Write PDF
out_pdf.write(f.name)

# Inspired from [https://stackoverflow.com/a/61627477/12452515]

ANNOT_KEY = '/Annots'           # key for all annotations within a page
ANNOT_FIELD_KEY = '/T'          # Name of field. i.e. given ID of field
ANNOT_FORM_type = '/FT'         # Form type (e.g. text/button)
ANNOT_FORM_button = '/Btn'      # ID for buttons, i.e. a checkbox
ANNOT_FORM_text = '/Tx'         # ID for textbox
SUBTYPE_KEY = '/Subtype'
WIDGET_SUBTYPE_KEY = '/Widget'

k = 0

# Re-read the source with pages added
# dictPdf contain for each page, fields 
pdf = pdfrw.PdfReader(f.name)
for page in pdf.pages:
    if page[ANNOT_KEY]:
        for annotation in page[ANNOT_KEY]:
            if annotation[ANNOT_FIELD_KEY] and annotation[SUBTYPE_KEY] == WIDGET_SUBTYPE_KEY :
                key = annotation[ANNOT_FIELD_KEY][1:-1] # Remove parentheses
                if key in dictPdf[k].keys():
                    if annotation[ANNOT_FORM_type] == ANNOT_FORM_button:
                        # button field i.e. a checkbox
                        annotation.update( pdfrw.PdfDict( V=pdfrw.PdfName(dictPdf[k][key]) , AS=pdfrw.PdfName(dictPdf[k][key]) ))
                    elif annotation[ANNOT_FORM_type] == ANNOT_FORM_text:
                        # regular text field
                        annotation.update( pdfrw.PdfDict( V=dictPdf[k][key], AP=dictPdf[k][key]) )
    k += 1

#pdf.Root.AcroForm.update(pdfrw.PdfDict(NeedAppearances=pdfrw.PdfObject('true')))

pdfrw.PdfWriter().write(f.name, pdf)

如果我取消注释此行pdf.Root.AcroForm.update(pdfrw.PdfDict(NeedAppearances=pdfrw.PdfObject('true'))),我会收到错误

pdf.Root.AcroForm.update(pdfrw.PdfDict(NeedAppearances=pdfrw.PdfObject('true')))
AttributeError: 'NoneType' object has no attribute 'update'

如果我尝试使用默认 PDF 来填写表格,它可以工作(但我没有添加页面): : pdf = pdfrw.PdfReader(pdfSrc)

最后,我用文本编辑器打开了 PDF,如果我在其中搜索一个值,我会找到它!(生成的 PDF 似乎是 1.3,也许是原因?)

4

0 回答 0