Skip to content

Extract data

Pull the same fields out of a stack of documents, as JSON or CSV.

Text is sent to an AI service

Your PDF is never uploaded. The text is extracted in your browser, shown to you, and only sent after you approve it.

What this does

This reads a set of documents and returns one row each, carrying the fields you asked for. Text is extracted in your browser and sent to the AI provider you choose with your own key; the files themselves never leave your device. The output is a JSON array or a CSV, with a _file column so every row says which document it came from.

It exists for the batch: twenty supplier invoices that have to become twenty rows in a ledger, a month of receipts before an expense claim, bank statements you want opening and closing balances from, or a folder of ID documents whose numbers need typing into a system.

How it works

  1. Drop up to twenty PDFs onto this page, then choose your provider and paste your API key.
  2. Pick a preset - invoice, receipt, ID document or bank statement - or choose your own fields and list the names you want, one per line.
  3. Leave the missing-fields toggle on. It is what makes an absent value come back empty instead of invented.
  4. Choose JSON or CSV, then press Extract. Each document is one request, and progress shows which one is running.
  5. Download the file. Every row has the same columns, in the order you asked for them, whether or not each document had them.

Leaving missing fields empty is the most important setting on this page, and it is on by default. Asked for an invoice number, a language model will produce one whether or not the document has one, and a plausible invented invoice number is far more damaging than a blank cell - it is wrong in a way nobody notices until a payment goes to the wrong place. With the setting on, the instruction is explicit: where a value is not clearly present, return nothing, and never estimate. Turn it off only when you want values the document implies but does not state.

Every row comes back with exactly the keys you asked for, in the order you asked for them, present in the document or not. Missing values become null in JSON and an empty cell in CSV. That is what makes the CSV open cleanly in a spreadsheet: rows of differing shapes make columns drift, and a total in one row ends up under a date in the next. If a model's answer cannot be parsed at all, that row is filled with blanks rather than aborting a twenty-file batch at file eleven.

Temperature is fixed at zero, because extraction is not a creative task and the same invoice should give the same answer twice. Numbers are requested as bare numbers, without currency symbols or thousands separators, and dates as ISO 8601 strings, so the CSV sorts and sums without a cleaning pass. The CSV is quoted to RFC 4180, which stops a supplier name with a comma in it from splitting a column.

The text arrives in reading order with the layout flattened, and that is a real limit on what can be pulled out. A total in the bottom-right corner of an invoice reads fine; a multi-column table of line items arrives as a stream of cells with nothing marking which column each belonged to. It is why the presets ask for header-level fields - totals, dates, parties - rather than line items. For a table you genuinely need as a table, PDF to Excel reconstructs the grid instead.

What this tool cannot do

  • The documents' text is sent to the AI provider you choose. The files themselves are not.
  • Line-item tables do not extract reliably, because the text arrives in reading order without column boundaries. Use PDF to Excel for a table you need as a table.
  • Even with missing fields left empty, a value can be read from the wrong place - a delivery date taken for an invoice date. Spot-check rows against the documents before using them.
  • A scanned PDF has no text to read. Run OCR a PDF over it first.

Questions people ask

What does leaving missing fields empty do?
It tells the model that a value not clearly present in the document must come back blank, and that inventing a plausible-looking one counts as a defect rather than as being helpful. It is on by default because an empty cell is a problem you can see immediately and a fabricated invoice number is one you find out about much later. Turn it off only when you want values the document implies but never states.
Can I choose my own fields?
Yes. Set the preset to your own fields and list the names, separated by commas or newlines - one per line is easiest to read back. Those names become the JSON keys and the CSV headers exactly as you typed them, so snake_case names like purchase_order_number work well. The built-in presets are ordinary field lists too; the invoice one asks for eleven fields, from invoice_number through to payment_terms.
How many documents can I do at once?
Up to twenty, each its own request, producing one row each. They share the character limit between them - 100,000 divided by the number of files, by default - so a document longer than its share is cut. If one document produces an answer that cannot be parsed, its row is filled with blanks and the batch carries on rather than failing partway through.
Where do my invoices go?
The files stay on your device. Their text goes to the provider you chose, one request per document, sent by your browser with your own key. There is no CekPDF server in the path and no CekPDF account, so nothing here holds a copy. If the documents carry personal data - ID cards and bank statements do - the terms that matter are your provider's.
How reliable are the values?
Reliable enough to save the typing, not reliable enough to skip the checking. Header-level fields on a clean invoice - number, date, total - come back right most of the time. Ambiguity is where it slips: two dates on the page and only one of them the invoice date, a subtotal that looks like a total, a tax figure split over two lines. Temperature is zero, so the answers are at least consistent between runs.

Related tools