Team Ai
Apppublic

documentExtractionag051/ExtractDocument

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
custom_processor.py127 linesDownload Raw Back to utils
1import logging2from .invoice_post_processing import extract_invoice_tables3 4logging.basicConfig(level=logging.INFO)5logger = logging.getLogger(__name__)6 7"""8Custom Post-Processing Module9==============================10 11This file lets you add custom post-processing steps for different document layouts.12 13HOW TO USE:141. Write your own Python functions in the `custom/` folder.15   - Each function receives:16       - ocr_elems: list of TextRect objects from OCR17       - validation_data: current validation data dict18       - page_dimensions: dict of page dimensions {page_num: (width, height)}19   - Your function must return the updated validation_data20 212. Register your functions in the LAYOUT_PROCESSORS dictionary.22   - Use the layout name as the key23   - The value is a LIST of functions to run in order24   25   Example:26       from custom.my_layout import fix_totals, fix_header27       28       LAYOUT_PROCESSORS = {29           "MY_LAYOUT": [fix_header, fix_totals]30       }31"""32 33#34# Layout -> List of handler functions35#36LAYOUT_PROCESSORS = {37    "Invoice": [extract_invoice_tables]38}39 40 41# -----------------------------------------------------------------------------42# Main routing logic43# -----------------------------------------------------------------------------44def do_custom_post_processing(45    input_data,46    validation_data,47    ocr_elems,48    column_headers=None,49    anchor_column=None,50    anchor_pattern=None,51    advanced_options=None52):53    """54    Main entry point for layout-based post-processing.55    56    Args:57        input_data (dict): Original input JSON data58        validation_data (dict): Validation data structure59        ocr_elems (list): List of TextRect objects60        column_headers (dict): Optional custom column headers61        anchor_column (str): Optional anchor column name62        anchor_pattern (str): Optional anchor pattern regex63        advanced_options (dict): Optional advanced options64    65    Returns:66        dict: Updated validation data67    """68    # Extract page dimensions from input data69    page_dimensions = _extract_page_dimensions(input_data)70    71    # For now, always run invoice table extraction72    # You can add layout detection logic here if needed73    handler_list = [extract_invoice_tables]74    75    logger.info(f"Running {len(handler_list)} handler(s)")76    77    for handler in handler_list:78        logger.info(f"Running handler: {handler.__name__}")79        80        try:81            validation_data = handler(82                ocr_elems=ocr_elems,83                validation_data=validation_data,84                page_dimensions=page_dimensions,85                column_headers=column_headers,86                anchor_column=anchor_column,87                anchor_pattern=anchor_pattern,88                advanced_options=advanced_options89            )90        except Exception as e:91            logger.error(f"Handler {handler.__name__} failed: {e}")92            import traceback93            traceback.print_exc()94    95    return validation_data96 97 98def _extract_page_dimensions(data):99    """100    Extract page dimensions from input data.101    102    Supports both simplified schema and original engine output format.103    """104    # Simplified schema105    if "pages" in data and isinstance(data.get("pages"), list):106        pages = data["pages"]107        if pages and "pageNum" in pages[0]:108            return {109                p.get("pageNum", idx + 1): (p.get("width", 0), p.get("height", 0))110                for idx, p in enumerate(pages)111            }112    113    # Original engine output114    if "engineData" in data:115        pages = (116            data.get("engineData", {})117            .get("imagePreprocessingResult", {})118            .get("pages", [])119        )120        return {121            idx + 1: (p.get("width", 0), p.get("height", 0))122            for idx, p in enumerate(pages)123        }124    125    logger.warning("Could not extract page dimensions")126    return {}127