【问题标题】:How can I get the page number for editable fields using pdfminer six如何使用 pdfminer 6 获取可编辑字段的页码
【发布时间】:2020-04-24 21:46:35
【问题描述】:

我按照此答案中的示例从 PDF 文档中获取可编辑字段值:

How to extract PDF fields from a filled out form in Python?

对于每个字段,我得到一个如下所示的数据结构。但该列表包括所有页面中的所有字段。如何确定每个字段所在的页面?在调试器中,我尝试查看 PDFObjRef 的“AP”和“P”项目,但这并没有引导我到任何地方。

'AP' = {dict: 1} {'N': <PDFObjRef:1947>}
'DA' = {bytes: 23} b'0 0 0 rg /ArialMT 10 Tf'
'F' = {int} 4
'FT' = {PSLiteral} /'Tx'
'M' = {bytes: 23} b"D:20200129121854-06'00'"
'MK' = {dict: 0} {}
'P' = {PDFObjRef} <PDFObjRef:1887>
'Rect' = {list: 4} [36.3844, 28.5617, 254.605, 55.1097]
'StructParent' = {int} 213
'Subtype' = {PSLiteral} /'Widget'
'T' = {bytes: 12} b'CustomerName'
'TU' = {bytes: 13} b'Customer Name'
'Type' = {PSLiteral} /'Annot'
'V' = {bytes: 21} b'Ball-Mart Stores, Inc.'

TIA

【问题讨论】:

    标签: python pdf field pdfminer page-numbering


    【解决方案1】:

    同样的问题,我花了 2 个小时才通过查看 PDF 找到 page.annots 的想法。

    它适用于 PyPDF2。 doc 之前由 doc = open('sample.pdf') 初始化

    idtopg = {}
    pge = 0
    for page in PDFPage.create_pages(doc):
        if page.annots:
            for annot in page.annots:
                por = PDFObjRef.resolve(annot)
                aid = por['T'].decode("utf-8")
                idtopg[aid] = pge
        pge += 1
    

    现在看看你的“T”。此处生成的 dict 为您提供每个 'T' 的页面

    myfieldid = thenameofyourfield['T'].decode('utf-8')
    print("The field id {0} in on page {1}".format(myfieldid, idtopg[myfieldid])
    

    【讨论】:

    • 这仅适用于与其小部件注释合并的表单字段对象,特别是不适用于具有多个小部件的字段。
    【解决方案2】:

    通过执行以下操作,我能够获取字段的页码:

    from pdfminer.pdfparser import PDFParser
    from pdfminer.pdfdocument import PDFDocument
    from pdfminer.pdftypes import resolve1
    
    fp = open(PdfUtility.resource_path(filename), 'rb')
    parser = PDFParser(fp)
    doc = PDFDocument(parser)
    kids = resolve1(doc.catalog['Pages'])['Kids']
    page = 0
    field_list = []
    for kid in kids:
        page += 1
        kid_fields = resolve1(resolve1(kid)['Annots'])
        for i in kid_fields:
            field_dict = {}
            field = resolve1(i)
            name, position = field.get('T'), field.get('Rect')
            if name:
                field_dict['name'] = name.decode('utf-8')
                field_dict['page'] = page
                field_dict['position'] = position
                print(field_dict)
                field_list.append(field_dict)
    

    【讨论】:

    • 这仅适用于与其小部件注释合并的表单字段对象,特别是不适用于具有多个小部件的字段。此外,它不适用于非平面页面树。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    相关资源
    最近更新 更多