首页 > 解决方案 > PDFrw - 从特定表单获取 PDF 表单字段和值

问题描述

感谢您阅读并可能提供帮助。

我阅读了 PDFrw PYthon 库并应用了几种解决方案来帮助我前进。不幸的是,我无法从所有页面中检索所有字段。

我想检索字段值以映射我的 data_dict,此数据是从 Excel 电子表格中获取的。以下代码输出即以下内容:

如您所见,它跳过了前两页,而肯定有表单字段!

我想阅读的 PDF 可以在这里找到。它来自荷兰政府,所以不用担心!https://download.belastingdienst.nl/belastingdienst/docs/verzoek_2021_lh_premie_volksverzeker_toepas_30_procent_regel_lh5981z11fol.pdf

printed in console: 

在第 1 页上工作

在第 2 页上工作

工作在第 3 页

printing the value; (Begindatum woonperiode 1. Dag, 2 cijfers.)
printing key-value; d_C
printing the value; (Maand, 2 cijfers.)

这里是实际代码:

import os, sys, re
import pdfrw

folder_path = os.getcwd().replace('\\', '/') + '/output.pdf'
input_pdf_path = 'formulier.pdf'
data_dict = {}

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

def fill_pdf(input_pdf_path, output_pdf_path, data_dict):
    template_pdf = pdfrw.PdfReader(input_pdf_path)

    for x in template_pdf.Root.AcroForm:
        print(f'element of acroform {x}')

    c = 1

    for page in template_pdf.pages:
        print(f'{chr(10)} working on page {c}')
        c += 1

        annotations = page[ANNOT_KEY]
        for annotation in annotations:

            if annotation['/TU']:
                value = annotation['/TU']
                print(f'printing the value; {value}')

            if annotation[SUBTYPE_KEY] == WIDGET_SUBTYPE_KEY:

                if annotation[ANNOT_FIELD_KEY]:
                    key = annotation[ANNOT_FIELD_KEY][1:-1]

                    print(f'printing key-value; {key} ')


                    if key in data_dict.keys():
                        if type(data_dict[key]) == bool:
                            if data_dict[key] == True:
                                annotation.update(pdfrw.PdfDict(
                                    AS=pdfrw.PdfName('Yes')))
                        else:
                            annotation.update(
                                pdfrw.PdfDict(V='{}'.format(data_dict[key]))
                            )
                            annotation.update(pdfrw.PdfDict(AP=''))

    pdfrw.PdfWriter().write(output_pdf_path, template_pdf)

fill_pdf(input_pdf_path, folder_path, data_dict)

标签: pythonpdfpdfrw

解决方案


推荐阅读