"""Extract one selectable-text PDF locally. See README before using scanned PDFs.""" from pathlib import Path import argparse import importlib.metadata import json import time from docling.datamodel.base_models import InputFormat from docling.datamodel.pipeline_options import PdfPipelineOptions from docling.datamodel.accelerator_options import AcceleratorOptions, AcceleratorDevice from docling.document_converter import DocumentConverter, PdfFormatOption parser=argparse.ArgumentParser(description=__doc__) parser.add_argument('--input',type=Path,default=Path('supplier-catalog.pdf')) parser.add_argument('--output',type=Path,default=Path('extracted')) args=parser.parse_args() if not args.input.is_file(): parser.error(f'Input PDF not found: {args.input}') args.output.mkdir(parents=True,exist_ok=True) options=PdfPipelineOptions() options.do_ocr=False options.do_table_structure=True options.enable_remote_services=False options.accelerator_options=AcceleratorOptions(device=AcceleratorDevice.CPU,num_threads=4) converter=DocumentConverter(format_options={InputFormat.PDF:PdfFormatOption(pipeline_options=options)}) started=time.time() result=converter.convert(args.input) doc=result.document (args.output/'supplier-catalog.md').write_text(doc.export_to_markdown(),encoding='utf-8') tables=[] for index,table in enumerate(doc.tables,start=1): frame=table.export_to_dataframe(doc=doc) filename=f'supplier-table-{index}.csv' frame.to_csv(args.output/filename,index=False) tables.append({'filename':filename,'rows':len(frame),'columns':list(map(str,frame.columns))}) receipt={'doclingVersion':importlib.metadata.version('docling'),'source':str(args.input),'conversionStatus':str(result.status),'pages':len(doc.pages),'tables':tables,'ocrEnabled':False,'remoteServicesEnabled':False,'conversionSecondsIncludingModelInitialization':round(time.time()-started,2),'exampleScope':'Small digitally created PDF; not an OCR or general accuracy benchmark.'} (args.output/'conversion-receipt.json').write_text(json.dumps(receipt,indent=2)+'\n') print(json.dumps(receipt,indent=2),flush=True)