pdfminer不会从填写的pdf表单中提取数据

时间:2016-12-15 23:55:29

标签: python python-2.7 pdf web-scraping pdfminer

我正在尝试使用pdfminer以pdf格式提取已填写的内容。访问pdf的说明如下:

  1. 转到https://www.ffiec.gov/nicpubweb/nicweb/InstitutionProfile.aspx?parID_Rssd=1073757&parDT_END=99991231
  2. 点击顶部第四份报告旁边的“创建报告”(即银行业组织系统风险报告(FR Y-15))
  3. 点击“您的财务报告请求已准备就绪”
  4. 要以蓝色提取内容,我复制了this post的代码:

    from pdfminer.pdfparser import PDFParser
    from pdfminer.pdfdocument import PDFDocument
    from pdfminer.pdftypes import resolve1
    
    filename = 'FRY15_1073757_20160630.PDF'
    fp = open(filename, 'rb')
    parser = PDFParser(fp)
    doc = PDFDocument(parser)
    fields = resolve1(doc.catalog['AcroForm'])['Fields']
    
    for i in fields:
        field = resolve1(i)
        name, value = field.get('T'), field.get('V')
        print '{0}: {1}'.format(name, value)
    

    这没有按预期提取数据字段 - 没有打印任何内容。我在另一个pdf上尝试了相同的代码并且它有效,所以我怀疑失败可能与第一个pdf的安全设置有关,如下所示 enter image description here

    对于代码工作的第二个pdf,安全设置显示所有操作的“允许”。我也尝试过使用pdfminer的pdf2txt.py功能(参见here),但原始pdf格式(我想要的)字段中的填写数据不在转换后的文本文件中;只转换了pdf的“平面”不可填写部分。有趣的是,如果我使用Adobe Reader的另存为文本将pdf转换为文本文件,则可转换文本文件中的可填充部分 。这就是我为解决失败的代码所做的工作。

    知道如何直接从pdf表单中提取数据吗?感谢。

1 个答案:

答案 0 :(得分:0)

我只能解释问题是什么,但无法提供解决方案,因为我没有正常的Python知识。

您的代码会迭代 AcroForm Fields 数组的直接子代,并期望它们代表表单字段。

虽然这种期望经常得到满足,但它实际上只代表一种特殊情况:表单字段被排列为结构,其中 Fields 数组作为根元素,例如如果你的样本文件有大树:

Fields tree

因此,您必须进入结构,而不是仅仅遍历 Fields 的直接子项,以查找所有表单域。