मैं कुछ पीडीएफ रूपों को संसाधित करने के लिए पाइथन का उपयोग करने की कोशिश कर रहा हूं जो Adobe Acrobat Reader का उपयोग करके भर चुके हैं और हस्ताक्षरित हैं।पायथन में एक भरे हुए फॉर्म से पीडीएफ फ़ील्ड निकालने के लिए कैसे?
मैं कोशिश की है:
- pdfminer डेमो: यह डेटा बाहर भरा में से किसी डंप नहीं किया।
- pyPdf: जब मैंने पीडीएफफ़ाइल रीडर (एफ) के साथ फ़ाइल लोड करने का प्रयास किया तो मैंने 2 मिनट के लिए कोर को अधिकतम किया और मैंने इसे छोड़ दिया और इसे मार दिया।
- ज्योथन और PDFBox: यह बहुत अच्छा काम कर रहा है लेकिन स्टार्टअप समय अत्यधिक है, मैं सीधे जावा में बाहरी उपयोगिता लिखूंगा यदि यह मेरा एकमात्र विकल्प है।
मैं पुस्तकालयों के लिए शिकार रख सकता हूं और उन्हें कोशिश कर रहा हूं लेकिन मुझे उम्मीद है कि किसी के पास पहले से ही इसका एक कुशल समाधान है।
अद्यतन: स्टीवन के जवाब के आधार पर मैं 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()
एक नोट के रूप में, मैंने बाहरी उपयोगिता के रूप में पीडीएफटीके का उपयोग करने का भी प्रयास किया और यह मालिक पासवर्ड से पहले नहीं मिला। – Olson