EnorexaEnorexa
Back to blog

AI

Why OCR Scrambles Multi-Page PDF Tables (And How Vision Pipelines Fix It)

November 5, 20264 min readBy Enorexa Team

Run a 40-page freight invoice or commercial insurance binder through standard OCR, and your downstream parser will silently corrupt roughly 12% of the line items. Most engineering teams blame the LLM for hallucinating numbers when their pdf table extraction pipeline fails in production. The model isn't hallucinating. Your upstream text extractor just read a borderless two-column table left-to-right across a page break, merged a wrapped product description into the unit price column, and fed the LLM a scrambled string.

Where Standard Text Streams Break Borderless Tables

Tools like pdf-parse, pypdf, and baseline Tesseract streams extract characters in the order they appear inside the PDF's internal content stream, which rarely matches visual reading order. When an accounting system generates a borderless PDF table, it often draws an entire column of dates from top to bottom before drawing the adjacent column of dollar amounts. If a single cell in column two wraps onto three lines while column four stays on one line, naive Y-coordinate sorting drifts by 4 to 6 points. Suddenly, a $14,200.00 charge from row 8 gets concatenated onto row 7's tax field. If that table splits across page 3 and page 4 without repeating its <thead> headers, chunk-based RAG pipelines lose column context completely and assign every numeric value on page 4 to the wrong schema key.

Hybrid Coordinate Clustering vs. Pure Vision Token Costs

The brute-force fix is rasterizing every PDF page at 300 DPI and sending the PNGs to a multimodal vision model. That works on a 3-page demo, but it destroys unit economics at scale. Rasterizing a 60-page clinical ledger at high resolution burns roughly 75,000 vision tokens per document and pushes p95 latency past 38 seconds. Instead, we run a fast pre-flight layout pass using pdfium and lightweight table structure recognition before touching an LLM. For born-digital PDFs, we extract exact character bounding boxes (x0, y0, x1, y1) and cluster vertical column gutters mathematically. We only rasterize and crop specific bounding-box regions to 150 DPI WebP images when the layout detector flags merged cells, rotated headers, or low-confidence scanned pages.

``typescript // Pre-flight check: detect when a borderless table spans across a page break interface TableRegion { pageIndex: number; bbox: [number, number, number, number]; // [x0, y0, x1, y1] in PDF points columnXAnchors: number[]; hasHeaderRow: boolean; } export function shouldStitchAcrossPageBreak( prevTable: TableRegion, nextTable: TableRegion, pageHeight = 792 ): boolean { const bottomMarginGap = pageHeight - prevTable.bbox[3]; const topMarginGap = nextTable.bbox[1]; // If table ends near bottom of Page N and starts near top of Page N+1 without headers if (bottomMarginGap > 75 || topMarginGap > 90 || nextTable.hasHeaderRow) { return false; } if (prevTable.columnXAnchors.length !== nextTable.columnXAnchors.length) { return false; } // Verify X-axis column gutters align within a 4pt tolerance return prevTable.columnXAnchors.every( (anchor, idx) => Math.abs(anchor - nextTable.columnXAnchors[idx]) <= 4.0 ); } ``

Enforcing Mathematical Row Reconciliation Before Database Writes

Even with stitched multi-page tables and cropped vision passes, you should never write extracted financial or inventory tables directly into PostgreSQL without deterministic checksums. In production pipelines, we force the extraction step to pull both the individual line items and the printed page subtotal or invoice total as separate fields. A deterministic validation worker then sums quantity * unit_price across every extracted row and compares it against the printed footer total.

If the delta exceeds $0.02 due to a misread decimal point or a dropped row at a page boundary, the pipeline halts automatic ingestion and routes that exact cropped table coordinate to a human-in-the-loop review queue. If your operations team is still manually fixing broken CSV exports from messy vendor PDFs or debugging silent data corruption in your document workflows, explore our Enorexa engineering services or talk to us to architect an extraction pipeline that verifies every row.