Live demo

Drop a document. See what the reading decides.

This page runs the library itself, the same code that npm install truecopy installs. Your file is read in this tab. It is never uploaded, and no server receives it.

It reads a PDF, or a table pasted out of one and saved as .csv, .tsv or .txt. Both go through the same steps. The file becomes a document, the document is cut into columns, and the cut reports what it could not vouch for.

Nothing is uploaded. Open your network tab and check.

Drop a PDF, CSV or pasted table here

or

This page has read a sample statement. Choose a file at the top of the page to read your own.

Read 6 rows. Nothing was flagged.
sample-statement.pdf
truecopy - sample-statement.pdf
pdf, 1 page(s), 6 row(s)

page 1 - cut at 100, 290

3 column(s), 6 row(s)

col  kind        filled  role
  0  -              83%  -
  1  -             100%  -
  2  -             100%  -

   1   02/05/2026 | CARTE AMAZON EU SARL | 12,40
   2   03/05/2026 | VIR SEPA LOYER MAI   | 750,00
   3   05/05/2026 | CARTE SNCF CONNECT   | 68,00
   4   09/05/2026 | PRLV EDF             | 91,32
   5   12/05/2026 | CARTE LE BOULANGER   | 7,90
   6              | TOTAL DES DEBITS     | 929,62

What it cannot vouch for

  • Nothing looked wrong from the shape of this page, which is not the same as "this reading is right".

The same thing, in your code

import { readTable } from 'truecopy';

const { rows, warnings } =
  await readTable(file, { workerSrc });

Quickstart · explainDocument

What you are looking at

The panel headed by the file name is the output of explainDocument. It shows where the reading cut the page into columns, what share of rows each column actually fills, and the rows themselves.

The card "What it cannot vouch for" lists what the reading could not vouch for. That list is what makes this library different from an extractor. An empty list is not a promise that the reading is right. It means nothing looked wrong from the shape of the page.

kind and role come back empty on purpose. This demo names no kinds, no thresholds and no roles, so it knows nothing at all about your document. That is also why no row is marked. A total can only be recognised once the table's own shape has been described. The tutorial is where you say what a date and an amount are, and the reading starts checking itself.