gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:45:26 29 4
gpt4 key购买 nike

我正在尝试使用 Python 处理一些使用 Adob​​e Acrobat Reader 填写和签名的 PDF 表单。

我试过了:

  • pdfminer演示:它没有转储任何填写的数据。
  • pyPdf :当我尝试使用 PdfFileReader(f) 加载文件时,它使核心达到最大 2 分钟,我只是放弃并杀死了它。
  • Jython 和 PDFBox : 效果很好,但启动时间过长,如果这是我唯一的选择,我将直接用 Java 编写一个外部实用程序。

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


更新:根据 Steven 的回答,我研究了 pdfminer,它做得很好。

from argparse import ArgumentParser
import pickle
import pprint
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import 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)
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 的内部结构和一些关于 pdf 格式的知识(当然是 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()

关于python - 如何从 Python 中填写的表单中提取 PDF 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3984003/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com