Comment extraire PDF des champs de remplir le formulaire en Python?

Je suis en train d'utiliser Python pour le processus de certains formulaires PDF qui ont été remplis et signés à l'aide d'Adobe Acrobat Reader.

J'ai essayé:

  • La pdfminer démonstration: il n'a pas de vidage de tout rempli de données.
  • pyPdf: il maxed un core 2 minutes quand j'ai essayé de charger le fichier de PdfFileReader(f) et j'ai simplement abandonné et l'a tué.
  • Jython et PDFBox: got qui fonctionne très bien mais le temps de démarrage est excessif, je vais juste écrire un utilitaire externe en droit de Java si c'est ma seule option.

Je peux garder la chasse pour les bibliothèques et les essayer, mais je suis en espérant que quelqu'un a déjà une solution efficace pour cela.


Mise à jour: Basé sur la réponse de Steven j'ai regardé dans pdfminer et il a fait le tour bien.

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()
  • Comme une note, j'ai aussi essayé d'utiliser pdftk comme un utilitaire externe et il n'a pas passé le mot de passe de propriétaire.
InformationsquelleAutor Olson | 2010-10-21