当前位置: 首页 > 面试题库 >

如何从Python中填写的表单中提取PDF字段?

佟颖逸
2023-03-14
问题内容

我正在尝试使用Python处理一些使用Adobe Acrobat Reader填写并签名的PDF表单。

我试过了:

  • 该pdfminer演示:它没有任何倾倒在填写数据。
  • pyPdf:当我尝试使用PdfFileReader(f)加载文件时,它最大化了内核2分钟,而我只是放弃并杀死了它。
  • Jython和PDFBox:虽然可以很好地工作,但是启动时间却很长,如果这是我唯一的选择,我只会用纯Java编写一个外部实用程序。

我可以继续寻找图书馆并尝试使用它们,但我希望有人已经对此提供了有效的解决方案。

更新: 根据史蒂文的答案,我研究了pdfminer,它的技巧很好。

from argparse import ArgumentParser
import pickle
import pprint
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdftypes import resolve1, PDFObjRef

def load_form(filename):
    """Load pdf form contents into a nested list of name/value tuples"""
    with open(filename, 'rb') as file:
        parser = PDFParser(file)
        doc = PDFDocument()
        parser.set_document(doc)
        doc.set_parser(parser)
        doc.initialize()
        return [load_fields(resolve1(f)) for f in
                   resolve1(doc.catalog['AcroForm'])['Fields']]

def load_fields(field):
    """Recursively load form fields"""
    form = field.get('Kids', None)
    if form:
        return [load_fields(resolve1(f)) for f in form]
    else:
        # Some field types, like signatures, need extra resolving
        return (field.get('T').decode('utf-16'), resolve1(field.get('V')))

def parse_cli():
    """Load command line arguments"""
    parser = ArgumentParser(description='Dump the form contents of a PDF.')
    parser.add_argument('file', metavar='pdf_form',
                    help='PDF Form to dump the contents of')
    parser.add_argument('-o', '--out', help='Write output to file',
                      default=None, metavar='FILE')
    parser.add_argument('-p', '--pickle', action='store_true', default=False,
                      help='Format output for python consumption')
    return parser.parse_args()

def main():
    args = parse_cli()
    form = load_form(args.file)
    if args.out:
        with open(args.out, 'w') as outfile:
            if args.pickle:
                pickle.dump(form, outfile)
            else:
                pp = pprint.PrettyPrinter(indent=2)
                file.write(pp.pformat(form))
    else:
        if args.pickle:
            print pickle.dumps(form)
        else:
            pp = pprint.PrettyPrinter(indent=2)
            pp.pprint(form)

if __name__ == '__main__':
    main()

问题答案:

您应该能够使用pdfminer做到这一点,但这将需要深入研究pdfminer的内部结构以及有关pdfhtml" target="_blank">格式的知识(当然是wrt形式,但也需要了解pdf的内部结构,例如“字典”和“间接对象”)

该示例可能会为您提供帮助(我认为它仅适用于简单情况,没有嵌套字段等)。

import sys
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdftypes import resolve1

filename = sys.argv[1]
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)

编辑:忘记提及:如果您需要提供密码,请将其传递给 doc.initialize()



 类似资料:
  • 问题内容: 我有一些PDF表单,我想用Django Web应用程序中的数据自动填充,然后提供给用户下载。哪个python库可以让我轻松地预填充PDF表单?这些表格旨在打印出来。 问题答案: 如果你要生成非常动态的PDF,并且需要以编程方式控制所有PDF(数据和布局),则Reportlab非常有用。 仅在现有的PDF中填写表格,reportlab是过大的,基本上,你将不得不在reportlab中从头

  • 我是新的PDF框,需要填写的信息在PDF表单,其中有节和字段名: 填写信息的名称和框 地址和填写信息的框 城市框来填充信息。 目前没有错误上面的代码正在工作填写一些垃圾字段。 需要用方框信息填满姓名,方框信息填满姓名,方框信息填满地址,方框信息填满地址,方框信息填满地址

  • 我在页面上有一个表单,用户可以在其中保存信息,还有一个下拉列表,可以从保存文件的目录中提取这些保存的文件。我想要的是当他们进入该页面时,当他们从下拉框中选择文件名时,它会将文件名放在输入框“CodeDescription”字段中,并将文件信息放在文本区域“Code”中,但我不确定如何解析该文件。下面是我当前的代码。 或者,相反地,我不介意在下拉菜单中选择正确的文件时,它只是在表单字段下面显示输出。

  • 问题内容: 是否有任何支持表识别和提取的开源库? 我的意思是: 识别表结构存在 根据内容对表格进行分类 以有用的输出格式(例如JSON / CSV等)从表中提取数据。 我浏览了有关此主题的类似问题,发现以下内容: PDFMiner解决了问题3,但似乎要求用户向PDFMiner指定每个表都存在表结构的地方(如果我错了,请纠正我) pdf-table-extract尝试解决问题1,但根据“待办事项”列

  • 我正在尝试使用Python从PDF文件中提取文本。我的主要目标是创建一个程序,读取银行对账单并提取其文本,以更新excel文件,方便记录每月的支出。现在我只专注于从pdf文件中提取文本,但我不知道怎么做。 目前将PDF文件中的文本提取为字符串的最佳且最简单的方法是什么?今天最适合使用的图书馆是什么?我该怎么做? 我尝试过使用PyPDF2,但每次我尝试使用extractText()从任何页面提取文本

  • 问题内容: 我将提取字符串中包含的所有数字。哪个更适合pur 例: 结果: 问题答案: 如果只想提取正整数,请尝试以下操作: 我认为这比正则表达式示例更好,原因有三点。首先,你不需要其他模块;其次,它更具可读性,因为你无需解析迷你语言;第三,它更快(因此可能更): 这将无法识别浮点数,负整数或十六进制格式的整数。如果你不能接受这些限制,则可以通过以下亭亭玉立的答案解决问题。