Blog · 16. 5. 2026 · 7 min čítania

Ako AI extrahuje dáta z PDF faktúry: technický rozbor

Ako moderné AI vision modely (GPT-4 Vision) extrahujú IČO, sumy a dátumy z PDF faktúry s presnosťou 90 – 95 %. Detail prompt engineeringu pre slovenský účtovný kontext.

Kým marketingová stránka AI fakturácie hovorí v sloganoch, technický rozbor ukazuje konkrétne mechanizmy. Tento článok rozkladá ako 1FAKTURA (a podobní cloudoví poskytovatelia) extrahujú dáta z prijatej PDF faktúry — od momentu, keď používateľ uploadne PDF, až po štruktúrované polia v databáze.

Stručná odpoveď

Moderný AI OCR pipeline pre PDF faktúru má 5 krokov:

  1. PDF → obraz (rendering prvých 1 – 3 strán cez pdfjs-dist)
  2. Obraz → AI vision model (typicky OpenAI GPT-4 Vision)
  3. AI prompt s slovenským kontextom (sadzby, sekcie, formát IČ DPH)
  4. JSON Schema validácia (Zod schema pre extrahované polia)
  5. Fallback na Tesseract OCR pri zlyhaní AI volania

Presnosť na typických slovenských PDF faktúrach: 90 – 95 %. Cena za extrakciu: €0,01 – €0,03 / PDF. Latencia: 2 – 5 sekúnd.

Krok 1 — PDF → obraz

PDF nie je obraz, je to vektorový dokument s textovou vrstvou (väčšinou). Ale AI vision modely očakávajú obraz, nie PDF. Konverzia:

import * as pdfjs from "pdfjs-dist";

async function pdfToImages(pdfBuffer: Buffer): Promise<Buffer[]> {
  const pdf = await pdfjs.getDocument({ data: pdfBuffer }).promise;
  const images: Buffer[] = [];
  for (let i = 1; i <= Math.min(pdf.numPages, 3); i++) {
    const page = await pdf.getPage(i);
    const viewport = page.getViewport({ scale: 2.0 }); // 2x zoom for OCR quality
    const canvas = createCanvas(viewport.width, viewport.height);
    const ctx = canvas.getContext("2d");
    await page.render({ canvasContext: ctx, viewport }).promise;
    images.push(canvas.toBuffer("image/png"));
  }
  return images;
}

Prečo prvé 1 – 3 strany: typická slovenská faktúra má 1 – 2 strany (hlavička, položky, súčty, päta). Posielanie všetkých strán zbytočne zvyšuje cenu AI volania. 3 strany sú dostatočný strop aj pre dlhšie faktúry s 20+ položkami.

Prečo 2x zoom: AI vision modely lepšie rozpoznávajú text na vyššom rozlíšení. 2x zoom je kompromis medzi presnosťou a veľkosťou súboru posielaného do API.

Krok 2 — Obraz → AI vision model

API volanie na OpenAI:

const response = await openai.chat.completions.create({
  model: "gpt-4o", // alebo "gpt-4-vision-preview"
  messages: [
    { role: "system", content: SLOVAK_INVOICE_EXTRACTION_PROMPT },
    {
      role: "user",
      content: images.map((img) => ({
        type: "image_url",
        image_url: { url: `data:image/png;base64,${img.toString("base64")}` },
      })),
    },
  ],
  response_format: { type: "json_object" },
  temperature: 0, // determinizmus pre extrakciu
});

Kľúčové parametre:

  • model: "gpt-4o" — vlajková multi-modálna verzia s lacnou cenou. Pre náročnejšie use casy gpt-4o (presnejšia, drahšia).
  • response_format: { type: "json_object" } — donucuje AI vrátiť validný JSON. Bez toho dostávate text, ktorý treba parsovať.
  • temperature: 0 — zero temperature = deterministická extrakcia. Pre kreatívne úlohy (texts generation) by sme zvolili vyššiu.

Cena: pri vstupe 2-stránkovej faktúry v 2x zoom (~50 KB každý obraz) a typickom výstupe ~500 tokenov je cena za volanie cca $0.01 – $0.03.

Krok 3 — Prompt engineering pre slovenský kontext

Generický globálny AI nevie odpovedať na slovenskú špecifiku (sadzby 23/19/5/0, IČ DPH formát SK + 10 cifier, § 69 ods. 12). Tu prichádza prompt engineering — pridáme do system prompts slovenský účtovný kontext.

Náš interný SLOVAK_INVOICE_EXTRACTION_PROMPT (zjednodušený):

Si AI asistent pre slovenský fakturačný systém. Extrahuj polia
z PDF faktúry. Vráť JSON s týmito poľami:

{
  "supplier": {
    "name": "string",
    "ico": "8 cifier alebo null",
    "ic_dph": "SK + 10 cifier alebo null",
    "address": "string alebo null"
  },
  "customer": { ... rovnaká štruktúra ... },
  "invoice_number": "string",
  "issue_date": "YYYY-MM-DD",
  "due_date": "YYYY-MM-DD alebo null",
  "items": [
    { "description": "string", "quantity": "number", "unit_price": "number", "vat_rate": 0|5|19|23 }
  ],
  "total_base": "number",
  "total_vat": "number",
  "total_gross": "number",
  "currency": "EUR | CZK | USD | ..."
}

Pravidlá:
1. IČ DPH SK má vždy tvar "SK" + 10 cifier. Ak nemá, vráť null.
2. IČO má 8 cifier. Ak nie, vráť null.
3. DPH sadzba je vždy 23, 19, 5 alebo 0. Ak nie je jednoznačné, vráť null.
4. Pri ručne písanom alebo nečitateľnom poli vráť null - NEPOKÚŠAJ SA ODHADNÚŤ.
5. Dátumy v tvare YYYY-MM-DD. Slovenské "16.5.2026" → "2026-05-16".
6. Sumy ako number, nie string. Decimal separator je bodka.
7. Sekcie kontrolného výkazu (A1, A2, B1, B2, C1, C2) NEEXTRAHUJ - to je
   účtovník priradí.

Slovenský kontext:
- Sadzba 23 % je štandard
- 19 % pre reštaurácie, ubytovanie, alkohol (príloha 7a zákona o DPH)
- 5 % pre potraviny, knihy, lieky (príloha 7)
- 0 % pre vývoz mimo EÚ (§ 47), intra-EÚ B2B (§ 43), reverse charge (§ 69/12)

S týmto prompt-om je presnosť pre slovenské faktúry 90 – 95 %. Bez slovenského kontextu by bola 60 – 70 % (AI by sa pomýlila na sadzbách, formáte IČ DPH, slovenských menách mesiacov).

Pre detail formátu UBL XML, ktorý sa od 1. 1. 2027 stane povinný, pozri ako vystaviť e-faktúru v UBL.

Krok 4 — JSON Schema validácia

AI niekedy vráti JSON s nesprávnymi typmi (string namiesto number, ISO formát namiesto Slovak formátu). Validácia cez Zod:

import { z } from "zod";

const InvoiceSchema = z.object({
  supplier: z.object({
    name: z.string(),
    ico: z.string().regex(/^\d{8}$/).nullable(),
    ic_dph: z.string().regex(/^SK\d{10}$/).nullable(),
    address: z.string().nullable(),
  }),
  customer: z.object({ ... }),
  invoice_number: z.string(),
  issue_date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
  due_date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).nullable(),
  items: z.array(z.object({
    description: z.string(),
    quantity: z.number(),
    unit_price: z.number(),
    vat_rate: z.union([z.literal(0), z.literal(5), z.literal(19), z.literal(23)]),
  })),
  total_base: z.number(),
  total_vat: z.number(),
  total_gross: z.number(),
  currency: z.enum(["EUR", "CZK", "USD", "GBP", "PLN", "HUF"]),
});

const validated = InvoiceSchema.safeParse(JSON.parse(aiResponse));
if (!validated.success) {
  // AI vrátila zle, fallback na Tesseract alebo notifikuj používateľa
}

Pri neúspechu Zod validácie spadneme na fallback workflow — používateľ dostane „AI extrakcia zlyhala, prosím vyplň polia manuálne", a my pošleme telemetric event do nášho monitoringu pre tréning lepších promptov.

Pre Zod patterny v slovenskom kontexte pozri náš bezplatný UBL validátor, ktorý použiva podobnú validáciu pre UBL 2.1 XML schémové polia.

Krok 5 — Fallback na Tesseract

Pri zlyhaní AI volania (timeout, rate limit, JSON parse error) sa pipeline prepne na Tesseract OCR + regex pravidlá:

import Tesseract from "tesseract.js";

async function fallbackExtract(image: Buffer) {
  const { data: { text } } = await Tesseract.recognize(image, "slk+eng+ces");
  // Regex extrakcia: IČO, IČ DPH, sumy, dátum
  const ico = text.match(/IČO[:\s]*(\d{8})/)?.[1];
  const icDph = text.match(/IČ DPH[:\s]*(SK\d{10})/)?.[1];
  const issueDate = text.match(/(\d{1,2}\.\s*\d{1,2}\.\s*\d{4})/)?.[1];
  // ...
  return { ico, icDph, issueDate };
}

Tesseract presnosť: 60 – 75 % (proti 90 – 95 % AI vision). Ale: zadarmo, rýchlejšie (1 – 2 sek vs 2 – 5 sek), bez závislosti na externom API. Pre vysokoobjemových používateľov je Tesseract dlhodobo udržateľnejší.

V 1FAKTURE používame hybridný režim: AI volanie pre kvalitu, Tesseract ako fallback. Používateľ vidí extrakciu rovnako, len zadná logika sa líši.

Presnosť per pole typu

Pri benchmark teste na 500 slovenských PDF faktúrach (zber z reálnej produkčnej prevádzky 1FAKTURY) sme namerali:

| Pole | AI presnosť | Tesseract presnosť | |---|---|---| | supplier.ico | 96 % | 78 % | | supplier.ic_dph | 94 % | 65 % | | invoice_number | 92 % | 70 % | | issue_date | 95 % | 80 % | | total_base | 93 % | 60 % | | total_vat | 91 % | 55 % | | vat_rate (správna sadzba) | 88 % | 45 % | | items[].description | 75 % | 50 % | | items[].quantity | 80 % | 55 % |

Najťažšie pole pre AI: vat_rate — vyžaduje pochopenie kontextu (rovnaký dodávateľ môže fakturovať rôzne sadzby podľa tovaru). Najľahšie: supplier.ico a issue_date — sú vždy v predvídateľnom mieste faktúry.

Náklady a cenové optimalizácie

Pre slovenský trh sú typické náklady AI extrakcie:

| Mesačný objem | Náklad AI volaní | % z mesačnej licencie SaaS | |---|---|---| | 50 PDF | €0,50 – €1,50 | 3 – 8 % | | 200 PDF | €2 – €6 | 8 – 20 % | | 1 000 PDF | €10 – €30 | 30 – 100 % | | 5 000 PDF | €50 – €150 | 100 % + |

Pri objeme nad 1 000 PDF mesačne sa AI náklady stávajú významné. Cloudoví poskytovatelia toto riešia 3 prístupmi:

  1. Hybridný režim (AI pre prvý pokus, Tesseract pre vysokoobjemových)
  2. Cachovanie podobných dodávateľov (rovnaký dodávateľ s rovnakým layoutom = AI volanie len pri prvej faktúre, ostatné cez regex extrakciu)
  3. Custom enterprise tarifa s extra AI poplatkami

Pre detail nákladov AI vo fakturácii pozri AI a slovenská fakturácia 2027 prehľad.

Privacy & GDPR

Pri AI extrakcii sa PDF posiela do OpenAI API. To znamená:

  • OpenAI je sub-procesor vašich dát podľa GDPR článku 28
  • OpenAI DPA (Data Processing Addendum) deklaruje, že vstupy z API neukladá pre tréning modelov ani neuchováva nad rámec 30 dní pre abuse monitoring
  • EU/SK dáta locality je obmedzená — OpenAI primárne hostuje v US (s EU regiónom v beta od 2024)

Pre vysokokriticky citlivé dokumenty (zmluvy s NDA, štátne zákazky) odporúčame:

  • Vypnúť AI OCR v nastaveniach 1FAKTURY
  • Robiť manuálny import s ručným vyplnením polí
  • Alebo využiť self-hosted Tesseract len (žiadne dáta neopúšťajú EÚ servery)

Budúce smerovanie 2027 – 2028

On-premise / self-hosted AI

Otvorené modely (Llama 3.3 70B Vision, Qwen2-VL 72B) dosahujú v 2026 cca 80 – 88 % presnosť na slovenských PDF faktúrach — zatiaľ pod OpenAI GPT-4o úrovňou, ale s plnou data-locality kontrolou. V 2027 očakávame zlepšenie na 90 %+, kedy bude self-hosted AI rovnocenná alternatíva pre privacy-conscious zákazníkov.

Multi-modálne AI

GPT-5 a nasledujúce modely budú spracúvať PDF + tabuľky + obrázky + chatovú konverzáciu v jednom volaní. Pre fakturáciu to znamená, že môžete poslať e-mailovú konverzáciu s klientom + priloženú faktúru a AI extrahuje obojaké do štruktúrovaných dát.

Realtime extraction

V 2027 očakávame, že GPT-realtime API (audio + vision v reálnom čase) umožní scan QR PAY kódu mobilom + AI okamžite extrahuje faktúru za sekundy bez čakania na batch processing.

Súvisí

Pre prehľad AI funkcií v 1FAKTURE pozri AI faktúra hub. Pre širší kontext AI vo fakturácii pozri AI a slovenská fakturácia 2027. Pre detail UBL formátu pre rok 2027 (kde AI bude generovať validné UBL XML) pozri ako vystaviť e-faktúru v UBL a UBL validátor. Pre kontext zákona pozri sprievodcu e-faktúrou 2027.

Pripravte sa pred deadlinom

Vystavte prvú
e-faktúru dnes.

14 dní plný Pro so zadaním karty (zrušíte kedykoľvek pred koncom skúšky). Alebo Štart €0 navždy bez kreditky. Migráciu a nastavenie spravíme za vás — zadarmo, do 24 hodín.

Začať zadarmo
Bez kreditky · ukončenie kedykoľvek
Migrácia z iDokladu / SuperFaktúr zadarmo
Slovenská podpora · pondelok–piatok 8–18
Pripravené na zákon č. 385/2025 Z. z. (1.1.2027)