如何使用 python 从 PDF 表单中读取数据

Posted

技术标签:

【中文标题】如何使用 python 从 PDF 表单中读取数据【英文标题】:How to read data from a PDF form using python 【发布时间】:2019-06-04 15:08:48 【问题描述】:

我需要从数百个 PDF 表单中读取数据。这些表格都有所有的文本输入框,表格是不可编辑的。我一直在尝试使用 Python 和 PyPDF2 将这些表单读取到 CSV 文件中(因为最终目标是一个 excel 数据库。

我曾尝试使用 acrobats 导出为 csv 函数,但这非常慢,因为每个表单都有 4 个嵌入图像以纯文本形式导出。我有以下代码,

from PyPDF2 import PdfFileReader


infile = "FormSample.pdf"

pdf_reader = PdfFileReader(open(infile, "rb"))


with open('exportharvest.csv','w') as exportharvestcsv:

    dictionary = pdf_reader.getFields(fileobj = exportharvestcsv)

textfields = pdf_reader.getFormTextFields()

dest = pdf_reader.getNamedDestinations()

print(dest)

上述代码的问题如下:getFields 命令仅获取表单中的~4 个数字签名字段(表单有~300 个条目)。有什么方法可以指示 python 查看所有字段吗?我知道文档中的字段名称,因为它们在导出为 pdf 时列出。

getFormTextFields() 返回

的字典

getNamedDestinations() 返回

的字典

感谢您的帮助。

【问题讨论】:

会不会是通过展平表单使表单字段不可编辑?扁平化使表单字段外观成为常规页面内容流的一部分并删除抽象字段。这可以解释你的观察。不幸的是,这也会使您难以提取内容,因为删除抽象表单字段会删除表单字段名称到 pdf 中表单字段值的简单映射。 【参考方案1】:

根据我的经验,pyPDF 也很慢。 这里应该做你想做的:

from PyPDF2 import PdfFileReader
from pprint import pprint
pdf_file_name = 'formdocument.pdf'

f = PdfFileReader(pdf_file_name)
fields = f.getFields()
fdfinfo = dict((k, v.get('/V', '')) for k, v in fields.items())
pprint(fdfinfo)



with open('test.csv', 'w') as f2:
    for key in fdfinfo.keys():
        if type(key)==type("string") and type(str(fdfinfo[key]))==type("string"):
            f2.write('"'+key+'","'+fdfinfo[key]+'"\n')

【讨论】:

即使修复了缩进,您的代码仍然无法执行 @Ali 我忘了删除以删除使用时间的行,应该是一个简单的修复。现在就做了。

以上是关于如何使用 python 从 PDF 表单中读取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 从 PDF 文件中读取简单文本?

如何在python中填写PDF表单?

从内存流中读取存储的 PDF

使用ElasticSearch / Symfony从pdf文件获取数据

如何使用 swift xcuitest 从 pdf 文件中读取数据

如何使用 Delphi 将数据从 XML 导入 PDF 表单?