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.

Illustrative comparison of a product catalogue and structured item data
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 inspected demo pins its Qwen revision. Dense grid tables are split into sections while retaining headers and footnotes as context. Original price text is stored alongside the normalized numeric value.

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 120 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

Illustrative comparison of a product catalogue and structured item data

Security inquiry

Request a non-binding quote for a pentest package or custom reverse engineering. We agree scope, start date and terms with you personally.

Pentest prices are per month, excluding VAT. All prices are starting prices. The final monthly fee depends on the number and extent of the agreed scopes and may be higher. Your quote confirms the binding price.

Book by 30 September 2026. Save 30% for your contract term. For pentest packages and custom reverse engineering booked on or before 30 September 2026 (Europe/Berlin). The saving applies for the entire agreed contract term. We agree the project start separately. Terms are confirmed in your quote.

Do not send passwords, credentials, confidential vulnerability details or firmware files. We will agree secure exchange and testing authorization personally.

Privacy notice

This inquiry is not a booking and does not secure promotional terms. After submitting, please confirm your email address.