Abbyy: Finereader Python
def _clean_invoice_number(self, raw): match = re.search(r'INV[-_]?\d5,10', raw) return match.group(0) if match else raw
return result import logging from functools import wraps logging.basicConfig(level=logging.INFO) logger = logging.getLogger( name )
if result.returncode == 0: print(f"OCR successful: output_path.output_format") else: print(f"Error: result.stderr")
with ThreadPoolExecutor(max_workers=max_workers) as executor: list(tqdm(executor.map(process_one, image_files), total=len(image_files))) batch_ocr_cli("./scans", "./ocr_output", max_workers=2) 5. Method 2: COM Automation (Windows, Deep Control) This method gives you programmatic access to FineReader's object model. Initialize FineReader COM Object import win32com.client import pythoncom import os class FineReaderCOM: def init (self): pythoncom.CoInitialize() self.app = win32com.client.Dispatch("FineReader.Application") self.app.Visible = False # Run in background abbyy finereader python
def __del__(self): self.app.Quit() pythoncom.CoUninitialize() fr = FineReaderCOM() text = fr.get_recognized_text("invoice.jpg") print(text[:500]) Zonal OCR example (extract specific invoice fields) zones = [(100, 200, 400, 230), # Invoice number (100, 300, 400, 330), # Date (500, 500, 800, 800)] # Total amount invoice_data = fr.zonal_ocr("invoice.jpg", zones) print(invoice_data) Advanced: PDF Searchable Creation def create_searchable_pdf(input_pdf_path, output_pdf_path): """Convert image-only PDF to searchable PDF/A.""" fr = FineReaderCOM() doc = fr.app.CreateDocument() # Load PDF pages doc.AddImageFile(input_pdf_path, 0)
def process_one(img_path): out_name = output_folder / f"img_path.stem_ocr" fine_read_cli(str(img_path), str(out_name), "txt")
def _parse_date(self, raw): match = re.search(r'\d1,2[/-]\d1,2[/-]\d2,4', raw) if match: return match.group(0) return None def _clean_invoice_number(self, raw): match = re
def process_invoice(self, image_path): """Extract structured data from invoice image.""" # Extract text from zones extracted = {} for field, zone in self.zones.items(): text = self.fr.zonal_ocr(image_path, [zone])[0] extracted[field] = text.strip() # Parse line items from full text full_text = self.fr.get_recognized_text(image_path) line_items = self._extract_line_items(full_text) # Parse and clean invoice = 'number': self._clean_invoice_number(extracted['invoice_number']), 'date': self._parse_date(extracted['invoice_date']), 'due_date': self._parse_date(extracted['due_date']), 'total': self._parse_amount(extracted['total_amount']), 'vendor': extracted['vendor_name'], 'vendor_address': extracted['vendor_address'], 'line_items': line_items, 'processed_at': datetime.now().isoformat() return invoice
return output_pdf_path FineReader Server provides a REST API for distributed OCR. REST API Client import requests import base64 import json from pathlib import Path class FineReaderServerClient: def init (self, base_url, username, password): self.base_url = base_url.rstrip('/') self.session = requests.Session() self.session.auth = (username, password)
image_files = list(input_folder.glob("*.png,jpg,jpeg,tiff,bmp")) REST API Client import requests import base64 import
result = subprocess.run(cmd, capture_output=True, text=True)
doc.Recognize("English") doc.Export(output_pdf_path, "PDF", export_params) doc.Close()