Hosted onhoraciohdev.dev.hyper.mediavia theHypermedia Protocol

How to show document metadata on the UI

Some customers want our help with document processing. For example, emails or invoices. We need to extract the information and add structured information.

I’d treat this as an “ingestion → extraction → validation → structuring → publishing” pipeline, with humans-in-the-loop where it matters (accuracy, exceptions, and policy).

1. Define the target “structured record”

Start with a schema per document type (invoice, receipt, purchase order, email request, etc.). Keep it simple and extensible.

Invoice example (core fields)

    Vendor: name, VAT ID, address

    Buyer: name, VAT ID

    Invoice: number, issue date, due date, currency

    Totals: subtotal, tax breakdown, total

    Line items: description, qty, unit price, tax rate

    Payment: IBAN, payment terms

    Provenance: source file/email id, received timestamp, page count

    Evidence: “this value came from this snippet / bbox / page”

That last part (evidence) is crucial for trust and audits.

2. Ingest + normalize

Inputs: PDFs, scans, email bodies, email attachments, EDI-ish PDFs, images.

Steps:

    Collect from sources (email inbox, upload folder, API).

    Convert to a canonical “document bundle”:

      text (best-effort)

      layout (pages, blocks)

      images (per page)

      metadata (sender, dates, thread id)

    De-duplicate (hashing) and classify.

graph TD subgraph client["PER-CLIENT (support contract)"] files["Client's .eml files\n(with PDF/Word/Excel)"] crawler["Folder Crawler Script"] llm_process["LLM Processing\n(user's API key)"] sql_adapter["SQL Export Adapter"] db["Client's Relational Database"] end subgraph product["PRODUCT (build into Seed)"] llm_layer["LLM Integration Layer\n(provider config + prompt gen)"] importers["Format Importers\n.eml | .pdf | .docx | .xlsx\n+ provenance annotations"] seed_docs["Seed Hypermedia Documents\n- Versioned & linked\n- Metadata fields\n- Block-level traceability\n- Full change history\n- Keyword + semantic search"] api["API / CLI / SDK\ndocument get | query | search"] end files --> crawler crawler --> llm_process llm_layer -.-> llm_process llm_process --> importers importers --> seed_docs seed_docs --> api api --> sql_adapter sql_adapter --> db

3. Classify document type + route

Use a lightweight classifier:

    Heuristics (sender, keywords like “Invoice”, “Factura”, amounts, IBAN)

    ML/LLM classification as fallback

Route to an extractor specialized for:

    Invoices

    Receipts

    Contracts

    Emails (requests, approvals, complaints, support)

4) Extract with “hybrid” methods (best results in practice)

Don’t bet everything on one technique.

For digital PDFs (text-based):

    Parse text + layout (tables, key-value zones)

    Use deterministic patterns for high-signal fields (VAT/IVA IDs, dates, invoice number formats, IBAN)

For scanned PDFs/images:

    OCR

    Then the same as above, but with lower confidence

LLM step (structured):

    Ask the model to output strict JSON that matches your schema

    Provide the model with:

      extracted text

      layout hints (tables, page headings)

      instructions like “return null if missing, don’t guess”

    Have the model also return citations/evidence (snippet + page, or bbox id) for each field.

5) Validate and score confidence

Run validators after extraction:

    Invoice number present?

    Totals match: sum(line_items) ≈ subtotal, subtotal + taxes ≈ total

    Dates are sensible (due date ≥ issue date)

    VAT/IVA format valid per country

    IBAN checksum valid

    Currency matches symbols

Compute an overall confidence score and decide automation level:

    High confidence → auto-ingest

    Medium → “review required”

    Low → “manual entry”

6) Human-in-the-loop review UI (where you win deals)

For medium confidence cases:

    Show the document side-by-side with extracted fields

    Highlight evidence snippets

    One-click fix + “why” (so you can learn)

Every correction becomes training data:

    vendor-specific templates

    recurring line-item patterns

    preferred mappings (e.g., account codes, cost centers)

7) Map to the customer’s systems

Structured output typically needs to flow into:

    ERP/accounting (NetSuite, SAP, Odoo, QuickBooks, Xero)

    CRM/ticketing (HubSpot, Zendesk, Jira)

    Document repository / knowledge base

Use a canonical internal model → export adapters:

    JSON (API)

    CSV (legacy)

    UBL / Factur-X / PEPPOL-like formats if needed

8) Store as “structured + source + provenance”

Keep:

    Original document (immutable)

    Extracted structured record (versioned)

    Evidence map (field → snippet/page/bbox)

    Processing log (model version, OCR version, rules triggered)

This makes audits, dispute resolution, and debugging straightforward.

9) Practical deployment approach

Phase 1 (2–4 weeks): one document type (invoices) + 2–3 pilot customers

    Build schema, ingestion, extraction, validation, review UI, export to one target system.

Phase 2: vendor learning + email intake

    Recognize repeat vendors and handle their quirks

    Parse “invoice via email” workflows (threading, attachments, approvals)

Phase 3: multi-doc workflows

    Purchase order ↔ invoice matching

    Payment status updates

    Exceptions and disputes

10) What I’d implement first (minimal but powerful)

    Ingestion from email + uploads

    Invoice classifier

    Extraction pipeline:

      PDF text extraction → LLM JSON

      OCR fallback

    Validation engine (math + formats)

    Review UI with evidence highlights

    Export to customer’s accounting system

    Continuous learning from corrections

    If you tell me:

      which formats (Spanish “Factura” PDFs? scans?),

      where the structured data needs to end up (ERP/CRM?), and

      typical volume (10/day vs 10k/day),
      I can sketch an architecture and a concrete “first pilot” plan with the exact fields and validators.


How to archive emails

Perfect — I’ll format this as a Seed-ready archive document, following the conventions you described:

    One Email Thread document

    One Email Message document per message

    Attachments linked

    Structured metadata

    Full provenance-ready structure

    Clean block structure for htmlToBlocks() or markdown import

Below is a Seed archive representation in Markdown form, ready for seed document create.

Do you like what you are reading? Subscribe to receive updates.

Unsubscribe anytime