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.
Vous devez vous connecter pour publier un commentaire.
Vous devriez être en mesure de le faire avec pdfminer, mais il faudra un peu de fouiller dans les entrailles de pdfminer et quelques connaissances sur le format pdf (wrt formes de cours, mais aussi sur le pdf en interne des structures comme des "dictionnaires" et "indirecte des objets").
Cet exemple peut vous aider sur votre chemin (je pense qu'il ne fonctionne que sur les cas les plus simples, sans imbriqués les champs, etc...)
EDIT: j'ai oublié de mentionner: si vous devez fournir un mot de passe, le passer à
doc.initialize()
Python 3.6+:
pip install PyPDF2
Le Python PyPDF2 paquet (successeur de pyPdf) est très pratique:
Puis
ff
est undict
qui contient toutes les informations d'un formulaire.Rapide et sale à 2 minutes de l'emploi; il suffit d'utiliser PDFminer pour convertir les PDF en xml, puis de saisir tous les champs.
Il n'est pas assez, juste une simple preuve de concept. J'ai besoin pour le mettre en oeuvre un système que je travaille, donc je vais être nettoyé, mais je pensais que j'allais le poster dans le cas où quelqu'un le trouve utile.
Mise à jour pour la dernière version de pdf mineur (changement d'importation et d'analyseur/doc d'installation dans la première fonction)
Il y a une faute de frappe sur ces lignes:
Devrait être: