The invented source
This is a made-up three-page price list from an imaginary supplier, with invented codes and prices. It was not taken from any real document or customer. Page 2 has one description that wraps onto a second line and one entry with no numeric price. Page 3 begins with a repeated heading line, which is layout and not a record. The correct count is 14 data rows: 6, 5 and 3.
If the matrix is wider than the box, scroll horizontally to read every column. Keyboard: focus the matrix and use Left/Right.
page | code | description | unit | price
1 | A100 | Pine batten 25x50 mm, 2.4 m | each | 3.20
1 | A101 | Pine batten 25x50 mm, 3.0 m | each | 4.05
1 | A102 | Pine batten 38x63 mm, 2.4 m | each | 5.10
1 | A110 | Plywood sheet 9 mm, 2440x1220 | sheet | 28.50
1 | A111 | Plywood sheet 12 mm, 2440x1220 | sheet | 36.90
1 | A120 | Wood screw 4x40 mm, box of 200 | box | 7.45
2 | A130 | Hinge, zinc, 75 mm | pair | 2.60
2 | A131 | Gate hinge, galvanised, heavy duty, | pair | 9.95
2 | | with fixing bolts (wrapped line) | |
2 | A132 | Door latch, black | each | 4.30
2 | A140 | Paint, white satin, 2.5 l | tin | 18.40
2 | A141 | Paint, colour match to sample | each | on request
3 | (repeated heading line, not a record)
3 | A150 | Dust sheet, 3.6x2.7 m | each | 3.75
3 | A151 | Masking tape, 50 m | roll | 1.95
3 | A160 | Cable clips, box of 100 | box | 2.15First pass: the total matches, two pages do not
Imagine a first extraction. Two tightly spaced lines on page 1 were read as a single row, and the wrapped second line of A131 on page 2 was read as a row of its own with an empty code. The repeated heading line on page 3 was correctly left out. The total is 14 against 14, so a check of the total alone would pass. Counting per page shows what happened.
- A total of 14 extracted rows against 14 expected passes a total-only check.
- Page 1 is one row short and page 2 has one row too many, so two errors cancel each other.
If the matrix is wider than the box, scroll horizontally to read every column. Keyboard: focus the matrix and use Left/Right.
page | rows counted | first pass | difference | note
1 | 6 | 5 | -1 | A101 and A102 read as one row
2 | 5 | 6 | +1 | wrapped line of A131 became a row with no code
3 | 3 | 3 | 0 | repeated heading line left out
all | 14 | 14 | 0 | total matches; two pages do notAfter correction: 13 clean rows and one exception
The corrections join the wrapped description to A131 and split A101 from A102. Entry A141 has no numeric price. The agreed rule for this example is that a row without a numeric price goes to the exceptions sheet with the price left blank, so the data sheet holds 13 rows and the exceptions sheet holds one. The rule is invented for this example; a real job agrees it with the owner first.
- Rows counted 14 = data rows 13 + exceptions 1.
- Every extracted row keeps its source page, so the counts can be repeated by filtering.
If the matrix is wider than the box, scroll horizontally to read every column. Keyboard: focus the matrix and use Left/Right.
page | rows counted | data sheet | exceptions | difference
1 | 6 | 6 | 0 | 0
2 | 5 | 4 | 1 (A141) | 0
3 | 3 | 3 | 0 | 0
all | 14 | 13 | 1 | 0The sample check, chosen before looking
A sample of three rows is fixed in advance: one that was wrongly joined, one with a wrapped description and the last row of the last page. Each field is compared with the source.
- A real sample would be larger, with a size and method agreed in writing; three rows keep the example short.
If the matrix is wider than the box, scroll horizontally to read every column. Keyboard: focus the matrix and use Left/Right.
row | field | source | extracted | result
A101 | description | Pine batten 25x50 mm, 3.0 m | Pine batten 25x50 mm, 3.0 m | match
A101 | price | 4.05 | 4.05 | match
A131 | description | Gate hinge, galvanised, heavy duty, with fixing bolts | Gate hinge, galvanised, heavy duty, with fixing bolts | match
A160 | price | 2.15 | 2.15 | matchWhat this does not prove
Matching counts and a matching sample do not show that every unsampled row is right, and nothing here checks that the invented prices are sensible. The result of a real job is reported as the measured counts and the sample outcomes, never as a percentage accuracy.
- No real list was extracted: this is an authored illustration of the method.
- No extraction tool, supplier or customer is implied.
Use it to specify an enquiry
If your own list is a text-based PDF in one layout, the one-off extraction job starts from £295 for up to 60 pages, after we have seen a redacted sample page and agreed the columns. The price is an untested proposal and payment follows the agreed checks and your sign-off. Send the page count, whether the text can be selected and the column headings you want, never the document.
Sources and limits
- Power Query PDF connector (Microsoft Learn) Checked 2026-10-11.
- Pdf.Tables returns tables found in a PDF; where multi-line rows are not identified properly the data may need cleaning, and similar tables on consecutive pages are combined by default.
- pdfplumber README Checked 2026-10-11.
- Table extraction works best on machine-generated PDFs and the project offers no text recognition.