Skip to content

From a price-list image to reviewable article data

Franz Bettag’s own engineering project combines a vision model with strict data validation and a DATANORM exporter. The public demo makes each step from the supplier document to the selected export records inspectable.

Fictional Musterwerk Nord price list with four positions, including EUR 8.50 per 100 pieces and one price on request.
Fictional source · 1 PDF page

Keep the price and its unit together.

EUR 8.50 per 100 pieces is not EUR 8.50 per piece. The reference preserves the price basis. A price on request stays empty.

Manually checked reference values, not measured AI output
Article Price / basis Export
MW-101Montagewinkel 40 x 40 mm 2.40 EURper 1 pcs Include
MW-205Schutzkappe, schwarz 8.50 EURper 100 pcs Include
MW-310Dichtband 20 mm 1.85 EURper 1 m Include
MW-420Sonderhalter nach Zeichnung On request Excluded

DATANORM: 3 articles included. 1 position without a price excluded. All prices exclude VAT.

{
  "positions": [
    {
      "article_number": "MW-101",
      "bbox": null,
      "currency": "EUR",
      "description": "Montagewinkel 40 x 40 mm",
      "evidence": "MW-101 Montagewinkel 40 x 40 mm 2.40",
      "minimum_quantity": null,
      "pack_quantity": null,
      "price": "2.40",
      "price_quantity": "1",
      "price_type": "net",
      "uncertainties": [],
      "unit": "Stück",
      "variant": null
    },
    {
      "article_number": "MW-205",
      "bbox": null,
      "currency": "EUR",
      "description": "Schutzkappe, schwarz",
      "evidence": "MW-205 Schutzkappe, schwarz 8.50",
      "minimum_quantity": null,
      "pack_quantity": null,
      "price": "8.50",
      "price_quantity": "100",
      "price_type": "net",
      "uncertainties": [],
      "unit": "Stück",
      "variant": null
    },
    {
      "article_number": "MW-310",
      "bbox": null,
      "currency": "EUR",
      "description": "Dichtband 20 mm",
      "evidence": "MW-310 Dichtband 20 mm 1.85",
      "minimum_quantity": null,
      "pack_quantity": null,
      "price": "1.85",
      "price_quantity": "1",
      "price_type": "net",
      "uncertainties": [],
      "unit": "m",
      "variant": null
    },
    {
      "article_number": "MW-420",
      "bbox": null,
      "currency": "EUR",
      "description": "Sonderhalter nach Zeichnung",
      "evidence": "MW-420 Sonderhalter nach Zeichnung auf Anfrage",
      "minimum_quantity": null,
      "pack_quantity": null,
      "price": null,
      "price_quantity": null,
      "price_type": "net",
      "uncertainties": [
        "Preis auf Anfrage; nicht für den Preisexport ausgewählt."
      ],
      "unit": "Stück",
      "variant": null
    }
  ],
  "reference_kind": "manually_transcribed_reference",
  "reference_note": "Manuell gegen das fiktive Original geprüfte Referenz, keine gemessene KI-Ausgabe. Manually checked reference from a fictional document, not a measured AI result.",
  "schema_version": "1.0",
  "source_kind": "synthetic_demo",
  "source_page": 1,
  "supplier": "Musterwerk Nord",
  "valid_from": "2026-09-01",
  "warnings": []
}
V 070926Preislisten-Konvertierung               Auszug - Werte gegen Quelle pruefen     Artikelstamm                       04EUR
A;N;MW-101;00;Montagewinkel 40 x 40 mm;;1;0;Stk;240;;;;
B;N;MW-101;;;;0;0;0;;;;;;;;
A;N;MW-205;00;Schutzkappe, schwarz;;1;2;Stk;850;;;;
B;N;MW-205;;;;0;0;0;;;;;;;;
A;N;MW-310;00;Dichtband 20 mm;;1;0;m;185;;;;
B;N;MW-310;;;;0;0;0;;;;;;;;

DATANORM 4 · CP850 · CRLF · EUR

Reference output manually checked against the fictional source. It explains the data flow; it does not measure model extraction quality.

Problem and role

A document is not an article catalogue

Price lists mix prices per piece, per 100 pieces and per metre. Variants, packaging and prices on request require more than copying a table. A wrongly assigned price can still be structurally valid in the receiving system.

Built by Franz Bettag

Design and implementation of the document workflow, model integration, output schema, review interface and DATANORM export. This is an independently developed demonstration using fictional documents.

The actual AI workflow

Document → vision model

PDF pages are rendered in sequence; images are orientation-corrected and size-limited. Qwen3-VL-8B-Instruct extracts price positions. The demo uses the base model at a pinned revision, without a custom fine-tune.

Model response → data checks

Pydantic validates the JSON schema. Decimal values, quantities and source coordinates are checked. Missing prices, currencies and unclear tax treatment remain visible as review notes. Source excerpts and page references support verification; the location markers are also model suggestions.

Human review → export

Rows are reviewed, edited and individually selected for export. The exporter writes DATANORM 4 V, A, B and optional T records in CP850 with CRLF. Article identifiers, EUR currency, prices excluding VAT and price units must satisfy the export rules.

Boundaries informed by security work

The prompt treats document content as data. Schema and export checks constrain downstream processing, and CSV cells are escaped against formula execution. Content review and a tested import into the customer’s system remain part of the workflow.

What the evidence shows

4 reference positions, 3 exported articles

The manually checked reference exports three articles. The fourth has a price on request and is excluded. EUR 8.50 per 100 pieces retains that price basis. This is a reproducible export example, not a measurement of AI extraction quality.

Continue without another inference call

A checkpoint is available after each completed page. Processing pauses when the quota is exhausted; the original document and checkpoint allow it to resume later. Saved JSON can be reviewed and converted to DATANORM without another GPU call. The source document, reference JSON, CSV, DATANORM.001 and export report are linked below.

Measurement in a customer project

Quality and business impact are measured on customer test pages against checked references: correct fields, missing rows, correction time, runtime and successful imports. The demo does not publish customer performance figures.

Demo scope

Page-by-page processing, validated export

PDF, PNG, JPG or WebP up to 100 MB. PDF pages are processed in sequence, with up to 60 positions per model response and 100,000 positions in the combined export. Failed or incomplete pages remain marked as unfinished. The DATANORM 4 export supports new EUR article records with one general price per article. Tiers, uncertain mappings and missing prices require correction or exclusion.

Public demo and production use

Live extraction runs on Hugging Face ZeroGPU and depends on the visitor’s quota. The fixed reference remains available independently. Data handling, hosting, supplier formats and target-system integration are specified for each customer deployment.

Evidence and next steps