Use in
ChatGPTClaudeGeminiGrok
Creates with
Your assistant
Output
XLSX
LazyCoder skill

Pull the numbers from PDFs into one table

Use this recipe to create xlsx.

XLSXClaude MCPResult review pending

Free

Paste into your assistant. It asks the questions; you answer in chat.

More ways to use
Install the downloaded skill

Extract the ZIP. Copy its lc-pdfs-to-one-table folder into ~/.claude/skills/ for Claude Code or ~/.codex/skills/ for Codex, then refresh the native app. Ask for the skill by name and answer its questions. The package includes the same published instructions and result checks. Native host execution is not yet verified.

For Claude web, use the connector or copy the prompt. Keep private details in your assistant.

How to use this skill

Copy, paste into your assistant, then answer its questions. No form or account is required here.

Open in ChatGPT ↗

Already connected? Copy the public starter below and paste into Claude. Keep private details in the chat.

Open Claude ↗
Optional: prepare details on this device

Bring your details

Attach the PDFs in the app and write “see attached” here, or paste each one's text under a line with its file name.
One per line or separated by commas, with what it means if the name isn't obvious, as in “Total: amount due including tax”.
2 optional details
Optional. Change it if one PDF holds several records, as in “invoice” or “line item”.
Only when you pick up a long stack in a new chat: paste the carry-over line from the last reply's “To continue” section.
This request goes last so your latest scope is clear. It stays in this tab.

Needed before the promised result: The PDFs, The columns you want. You can still copy the reusable prompt and provide these in your assistant.

Saved only on this device. Copy counts contain the skill ID, never your text.

Read the prepared prompt
## LazyCoder conversation guide (conversation-v2)
1. Start a conversation, not a form-filling task. Read my latest request and the facts already in this chat before asking anything.
2. Ask only the missing questions needed for the requested result, in a short numbered list (at most three at a time), then WAIT for my answers. Use a native question tool if available; plain chat works too. Never ask me to replace placeholders or fill in a template.
3. Skip questions already answered. Treat unresolved {{placeholders}} and [FIELD LABELS] as missing facts, never literal input. Do not treat an illustrative example as my facts.
4. Use the authored defaults only when relevant; mention material defaults. Ask conditional questions only when their condition applies; if unsure whether it applies, ask. Optional preferences must not block a safe first draft unless the authored instructions require confirmation.
5. Do not invent tasks, dates, names, claims, permissions or missing source material. When required facts are absent, ask and wait instead of producing the final artifact. If everything needed is already supplied, proceed without re-asking.
6. My latest scope correction overrides earlier examples and scope, within the recipe safety and source rules. Resolve conflicts before acting. The authored instructions and output contract remain authoritative; this conversation guide does not grant tool, account, payment or publishing permission.
7. Keep my private answers and generated result in this assistant chat. Do not send them to LazyCoder. Generate the requested format here and check it against the output contract before handing it over.

### Questions to ask only when missing
- What should I use for “The PDFs”? [required] Attach the PDFs in the app and write “see attached” here, or paste each one's text under a line with its file name.
- What should I use for “The columns you want”? [required] One per line or separated by commas, with what it means if the name isn't obvious, as in “Total: amount due including tax”.
- What should I use for “What one row is”? [optional] Optional. Change it if one PDF holds several records, as in “invoice” or “line item”. Authored default: document
- What should I use for “Carry-over from the last part”? [optional] Only when you pick up a long stack in a new chat: paste the carry-over line from the last reply's “To continue” section. Authored default: none

## LazyCoder delivery guide (delivery-guide-v1)
1. Read the latest request, source material and authored requirements first. Ask only for missing facts. Check that this host can create the promised format; use only a fallback explicitly allowed by the authored recipe. If neither is available, explain the gap before starting. Do not promise a rendered film, editable deck or working file when you can only provide its script or outline.
2. Create the complete result in the authored output specification, preserving source facts and the latest agreed scope. Keep assumptions and missing information explicit. Do not silently omit required parts or leave unresolved ingredient markers. Intentional blanks in a reusable template are different from unanswered recipe inputs.
3. Check the actual result against every authored check, including source facts, counts, dates and required sections. Where tools allow it, inspect the actual saved file and compare it with the answer. Record which checks ran, which failed and which still need human or destination review. A filename, render, successful command or preview alone does not prove the promise was met.
4. Hand over the complete editable file, or the complete copyable fallback explicitly allowed by this recipe. Say which delivery you used and any unresolved limitations. Do not report a file as attached, imported, sent or published unless that action actually succeeded. Keep private inputs and output in this assistant; never send them to LazyCoder.
Use existing authorization for ordinary work. Before any additional paid generation, external write or publishing step, check that the current request authorizes that exact action and cost. If it does not, finish the useful authorized draft and ask at that boundary. Never silently retry or replace an ambiguous paid job.
The authored recipe and latest safe scope remain authoritative. This guide grants no new tools, permissions, provider access or claim of successful execution.

## Authored skill instructions
## 1. Outcome
Read every document below and line up the requested facts in one table, with one row per document, delivered as an .xlsx file where you can make one or as CSV to paste, in the sections set out in part 6. Done means: every file is accounted for, every value is copied from the document with its page, every gap is marked instead of guessed, and anything in doubt is flagged. If the stack is too long for one reply, done means this part is complete and the reply says exactly how to continue.

## 2. Context
Columns wanted:
"""
[THE COLUMNS YOU WANT]
"""

One row per: document
Carry-over from an earlier part: none

Documents:
"""
[ATTACH YOUR PDFS, OR PASTE THEIR TEXT HERE]
"""

Who it's for: someone who would otherwise open each PDF and copy the facts by hand, and who needs a table they can sort, filter and check against the source in seconds.

Blank fill-ins: a value above that still reads as a capitalised placeholder in square brackets (such as [THE COLUMNS YOU WANT]) was left blank. Brackets inside the documents are part of the documents.
- Documents that say "see attached": use the attached files.
- No documents: reply only "No documents came through. Attach the PDFs or paste their text and send again." Never invent documents or values.
- No columns: reply only "No columns came through. List the columns you want, one per line, and send again."
- No row setting: one row per document.
- No carry-over, or "none": this is part 1.
- Pasted text with no file names: name the documents Doc 1, Doc 2, and so on, in the order pasted.

## 3. What to pull out
For each column: the value as printed, the page (or section, for documents without page numbers) it came from, and the exact words when it needs a check.

Edge cases:
- A scanned page or image-only PDF: read it if you can read images, with Confidence at most Medium. If you can't, give the file a row with Status "Unreadable" and every value "Unclear", and list it.
- A protected, corrupt or empty file: a row with Status "Unreadable", listed.
- Missing pages (page numbers jump, or "page 3 of 5" in a 2-page file): fill what is there, Status "Incomplete", and say which pages are missing.
- A file that isn't the expected kind of document: a row with every value "Not found", Status "Incomplete", and "Not a <kind of document>" in Notes.
- A column that doesn't apply to that kind of document (no order number on a till receipt): "N/A", which doesn't make the row Incomplete.
- One file holding several records (several invoices in one PDF): one row per record, each with the same file name and its own pages.
- The same field with two different values in one file: use the one from the summary, final or signed part (a totals box over a figure in the text; an amended version over the original), set Status "Check", and give both values with their pages in Notes.
- The same document twice (the same key from a different file, or identical files): keep both rows, and set Status "Duplicate of #<row>" on the one with the higher row number. Rows from the same file that share a key, such as the line items of one invoice, are never duplicates of each other. The key is the first requested column that identifies a document (such as an invoice or contract number); if there is none, the first three requested columns together.
- A date that could be read two ways (03/04/2026): decide from other dates in the same document, its country or its currency. If still unsure, write your best reading, set Status "Check", and quote the original in Notes.

## 4. Steps
1. List the files in name order (A to Z) and number them 1, 2, 3. If there is a carry-over, apply the continuing rule in part 5. Decide this part's files.
2. Define each column (part 6, section 2): a plain meaning, a type and a format. Where the person gave only a name, write the likeliest meaning and mark it "(definition assumed)".
3. For each file in this part, find every column's value and its page, then apply the edge cases in part 3.
4. Apply the format rules, then run the arithmetic check on documents with stated totals.
5. Flag duplicates (against the carry-over's keys too), write the output, then run the self-check.

## 5. Rules
- Copy values. The only changes allowed are the format rules below (dates, numbers, signs, units) and the flagged best reading of an ambiguous date. Never calculate a value, fill one in from another document, or guess. A value that isn't in the document is "Not found"; one that is there but unreadable or ambiguous is "Unclear"; one that doesn't apply is "N/A". No cell is ever blank.
- Formats: dates as YYYY-MM-DD; numbers plain, with a dot for decimals, no thousands separators and no symbols, with a minus sign for negatives (credit notes, amounts in brackets); yes-or-no columns as Yes or No; text as printed, trimmed. Value cells hold only the value: no page, note or unit.
- Money: never convert currencies. If the whole stack uses one currency, put its code in the column name, as in "Total (EUR)". If it mixes currencies, add a "<column> currency" column with the three-letter code beside each money column.
- Units: convert to the unit most of the documents use, only where the conversion is exact (grams to kilograms), and note it in the header.
- Source: every row has one Source column listing the page of each value, as in "Invoice date p.1; Total p.2". Values marked Not found or N/A have no page.
- Status per row: "Complete" (every value found or N/A), "Incomplete" (any Not found or Unclear), "Check" (a conflict, an uncertain date or a failed arithmetic check), "Unreadable", or "Duplicate of #<row>". If several apply, list them separated by " · ".
- Confidence per row: High (every value read from clear printed text), Medium (any value read from a scan or handwriting, or a format judgement), Low (Status includes Check, or any value is Unclear).
- Notes: for every Unclear or Check value, the column, the page and the original words (at most 12), and both values for a conflict.
- Arithmetic check: where a document states line items and a total, or a subtotal, tax and total, check the sum. A difference over 0.01 sets Status "Check", with both figures in Notes. For a document split across parts, run the check in the part that holds its stated total, using the "subtotal so far" carried in the carry-over line next to that file's next record.
- Parts: the table always goes in the reply, so each part is at most 10 files, about 100 pages and 40 table rows, whichever comes first. Rows are numbered on from part to part. <P>, the number of parts, is your estimate from the stack; update it in later parts if it changes, and say so in the header.
- One file with more than 40 records (or more than about 100 pages): split it across parts at a record boundary, never inside a record. Number its records 1, 2, 3 in the order they appear. This part ends after the record that brings it to 40 rows, and the next part starts at the next record of the same file. The header says "file <n>, records <a>–<b>"; the file counts as read, and its page, unreadable and no-values status is settled, only in the part where its last record is done.
- Continuing in the same chat: when the person replies "continue", do the next part with the same columns and rules, check duplicates against every earlier row, and keep the run summary's totals for all parts so far.
- Continuing in a new chat: read the carry-over line (part done, files total, next file and record, next row, totals so far, keys seen with their rows and files). This part is the next part number, and <N> is the files total. If the files attached number at least the "next file" number, skip the files numbered before it; if fewer are attached, they are the remaining files, so number them from it. If the line says "from record <k>", start that file at record <k>. Number rows from "next row", check duplicates against "keys seen" (in <key>#<row>@<file>, the number after # is its row, for "Duplicate of #<row>", and the number after @ is its file, so rows from the same file are never duplicates), and add this part's counts to every carry-over total, keeping the named files. The spreadsheet in a new chat holds this part's rows only.

## 6. Output
Use these sections in this order. Write "None" under any that is empty.
1. **Header**: what was extracted and what one row stands for; "Part <p> of <P>: files <a>–<b> of <N>" (or "All <N> files in one part"), with "file <n>, records <a>–<b>" when a file is split; the currency and unit notes; any assumption; and the line "Before sharing this table, remove any personal or financial details the reader doesn't need."
2. **Columns**: a table with the columns Column | Meaning | Type and format | Where it's usually found. In later parts, write "Same columns as part 1".
3. **The table**: one Markdown table with the columns Row | File | each requested column, in the person's order (with any currency column beside its money column) | Source | Status | Confidence | Notes. The header appears once. Every file in this part has at least one row.
4. **Flags**: one line per row whose Status is Check, Incomplete, Unreadable or Duplicate: the row, the file and what is wrong, pointing to its Notes.
5. **Run summary**: files listed; files in this part; files read; files unreadable (named); files with no values found (named); rows made; values found, Not found, Unclear, N/A and Check, counted; arithmetic checks passed and failed. After part 1, the same counts for all parts so far.
6. **Spreadsheet**: if you can create files, build it with code and attach it as extracted-table.xlsx (extracted-table-part<p>.xlsx for a later part; in the same chat it holds every row from part 1 on, in a new chat this part's rows only). It has the tabs Table (exactly the columns of section 3; real date and number cells; header row frozen; filters on), Columns, Flags and Summary. If you can't create files, write "Your app can't make the file here. Copy the box below into a file named extracted-table.csv, or paste it into a spreadsheet." and give the rows of this part as CSV in one code block, with exactly the columns of section 3, every field holding a comma or quote wrapped in double quotes, and inner quotes doubled. The header line goes in part 1 only; later parts add "Paste these rows under the last row."
7. **Next**: if files remain: "Part <p> of <P> done: files <a>–<b> of <N>. To continue here, reply: continue. To continue in a new chat, paste this prompt again, attach the remaining files, and put this line in Carry-over:" followed by one line in a code block, with every total counted over all parts so far:
   "done part <p> of <P> · files total <N> · next file <n> (add "from record <k>, subtotal so far <amount>" when that file was split) · next row <r> · totals: files read <n>, unreadable <n> (<their names, or none>), no values found <n> (<their names, or none>), rows <n>, found <n>, Not found <n>, Unclear <n>, N/A <n>, Check <n>, arithmetic passed <n>, arithmetic failed <n> · keys seen: <key>#<row>@<file>, <key>#<row>@<file>, …"
   These are exactly the fields a new chat needs to fill the header and every run-summary count. If there are more than 100 keys, give the last 100 and say "duplicate check covers the last 100 keys only". If none remain: "All <N> files done."

## 7. Self-check
Before replying, check each of these and fix any failure:
- Every file in this part has at least one row, and this part's files equal the files read in it plus the files unreadable in it plus any split file still in progress.
- Every row has the file name, a value or a marker in every column, and a Source entry for every value found; no cell is blank, and no value cell holds a page or note.
- Every value can be found on the page given, word for word or changed only by the format rules; nothing is calculated or guessed.
- Every date is YYYY-MM-DD and every number follows the number rule; no column mixes currencies or units.
- Every conflict, uncertain date, failed arithmetic check and duplicate (including against earlier parts or the carry-over keys) has its Status and its line in Flags.
- The counts in the run summary match the table, and after part 1 the totals include the earlier parts.
- The part stays within 10 files and 40 rows (a file with more than 40 records is split at a record boundary), and the rows are numbered on from the last part.
- The spreadsheet file or the CSV holds exactly the rows the rules above say, with the same columns and values as the table.
- The Next section gives the right file, record and row numbers and, if files remain, a complete carry-over line: the part done and <P>, the files total, every run-summary total for all parts so far (with the unreadable and no-values files named), every key with its row and file, and the running subtotal of any split file.
Then reply with the output only, ending with one line: "Checked: <n> files, <n> rows, <n> Not found, <n> Unclear, <n> flagged, part <p> of <P>."

## 8. Setup
Works as one paste in any chat app that takes file attachments. Attach the PDFs and leave "see attached" in the documents block. Where the app can create files, you get an .xlsx to download; where it can't, you get CSV to save or paste into a spreadsheet. A long stack comes back in parts: reply "continue" for the next one in the same chat, or start a new chat with the remaining files and paste the carry-over line the reply gives. A single file with more than 40 records is split across parts too. Remove or cover personal and financial details you don't need before uploading.
Review your result locally

Paste the result after your assistant creates it. This optional check stays in this tab and is not sent to LazyCoder.

The facts from a stack of PDFs lined up in one table.

Version & review details

What you get

  • The facts from a stack of PDFs lined up in one table.

Good fit

  • The facts from a stack of PDFs lined up in one table.
  • Use this when you can provide: The PDFs; The columns you want.

Not for

  • Unattended actions, sending or publishing without your review.
  • Treating a draft as checked facts without comparing it with your sources.

About this skill

You say
Help me pull the numbers from PDFs into one table. Ask me for any details you need first.
Show more

Read every document below and line up the requested facts in one table, with one row per {{row_is}}, delivered as an .xlsx file where you can make one or as CSV to paste, in the sections set out in part 6. Done means: every file is accounted for, every value is copied from the document with its page, every gap is marked instead of guessed, and anything in doubt is flagged. If the stack is too long for one reply, done means this part is complete and the reply says exactly how to continue.

Requirements & limits

  • The PDFs — required for the result. Attach the PDFs in the app and write “see attached” here, or paste each one's text under a line with its file name.
  • The columns you want — required for the result. One per line or separated by commas, with what it means if the name isn't obvious, as in “Total: amount due including tax”.

Works as one paste in any chat app that takes file attachments. Attach the PDFs and leave "see attached" in the documents block. Where the app can create files, you get an .xlsx to download; where it can't, you get CSV to save or paste into a spreadsheet. A long stack comes back in parts: reply "continue" for the next one in the same chat, or start a new chat with the remaining files and paste the carry-over line the reply gives. A single file with more than 40 records is split across parts too. Remove or cover personal and financial details you don't need before uploading.

These authored checks require source-aware human or host review; passing structure alone does not establish a successful result.

Result checklist

  • One table with your columns for every file, and the file name on every row
  • A page reference for every value, in its own Source column
  • Missing values marked “Not found” or “Unclear”, never guessed
  • Dates, numbers and currencies in one sortable style
  • Conflicts, duplicates and unreadable files flagged, with a count of every file read
  • An .xlsx file where your app can make one, or CSV to paste; long stacks in parts you can continue
Full output specification
Use these sections in this order. Write "None" under any that is empty.
1. **Header**: what was extracted and what one row stands for; "Part <p> of <P>: files <a>–<b> of <N>" (or "All <N> files in one part"), with "file <n>, records <a>–<b>" when a file is split; the currency and unit notes; any assumption; and the line "Before sharing this table, remove any personal or financial details the reader doesn't need."
2. **Columns**: a table with the columns Column | Meaning | Type and format | Where it's usually found. In later parts, write "Same columns as part 1".
3. **The table**: one Markdown table with the columns Row | File | each requested column, in the person's order (with any currency column beside its money column) | Source | Status | Confidence | Notes. The header appears once. Every file in this part has at least one row.
4. **Flags**: one line per row whose Status is Check, Incomplete, Unreadable or Duplicate: the row, the file and what is wrong, pointing to its Notes.
5. **Run summary**: files listed; files in this part; files read; files unreadable (named); files with no values found (named); rows made; values found, Not found, Unclear, N/A and Check, counted; arithmetic checks passed and failed. After part 1, the same counts for all parts so far.
6. **Spreadsheet**: if you can create files, build it with code and attach it as extracted-table.xlsx (extracted-table-part<p>.xlsx for a later part; in the same chat it holds every row from part 1 on, in a new chat this part's rows only). It has the tabs Table (exactly the columns of section 3; real date and number cells; header row frozen; filters on), Columns, Flags and Summary. If you can't create files, write "Your app can't make the file here. Copy the box below into a file named extracted-table.csv, or paste it into a spreadsheet." and give the rows of this part as CSV in one code block, with exactly the columns of section 3, every field holding a comma or quote wrapped in double quotes, and inner quotes doubled. The header line goes in part 1 only; later parts add "Paste these rows under the last row."
7. **Next**: if files remain: "Part <p> of <P> done: files <a>–<b> of <N>. To continue here, reply: continue. To continue in a new chat, paste this prompt again, attach the remaining files, and put this line in Carry-over:" followed by one line in a code block, with every total counted over all parts so far:
   "done part <p> of <P> · files total <N> · next file <n> (add "from record <k>, subtotal so far <amount>" when that file was split) · next row <r> · totals: files read <n>, unreadable <n> (<their names, or none>), no values found <n> (<their names, or none>), rows <n>, found <n>, Not found <n>, Unclear <n>, N/A <n>, Check <n>, arithmetic passed <n>, arithmetic failed <n> · keys seen: <key>#<row>@<file>, <key>#<row>@<file>, …"
   These are exactly the fields a new chat needs to fill the header and every run-summary count. If there are more than 100 keys, give the last 100 and say "duplicate check covers the last 100 keys only". If none remain: "All <N> files done."

Version and review evidence

pdfs-to-one-table
Version: recipe-9e6c7f32d7317dffe0547f7e
Release: publication-2cc5f3d871330e560bedbc0a
Fingerprint: 9e6c7f32d7317dffe0547f7e9212d5ca1143da5fbee25bfada3f1648c35aebe1

Generated-result quality is not yet reviewed for this version. Existing content reviews do not verify a result made for you. Review method

No host-tested compatibility evidence is attached to this version. Listed apps are setup options.

Read the reusable instructions
## 1. Outcome
Read every document below and line up the requested facts in one table, with one row per {{row_is}}, delivered as an .xlsx file where you can make one or as CSV to paste, in the sections set out in part 6. Done means: every file is accounted for, every value is copied from the document with its page, every gap is marked instead of guessed, and anything in doubt is flagged. If the stack is too long for one reply, done means this part is complete and the reply says exactly how to continue.

## 2. Context
Columns wanted:
"""
{{columns}}
"""

One row per: {{row_is}}
Carry-over from an earlier part: {{continue_from}}

Documents:
"""
{{pdfs}}
"""

Who it's for: someone who would otherwise open each PDF and copy the facts by hand, and who needs a table they can sort, filter and check against the source in seconds.

Blank fill-ins: a value above that still reads as a capitalised placeholder in square brackets (such as [THE COLUMNS YOU WANT]) was left blank. Brackets inside the documents are part of the documents.
- Documents that say "see attached": use the attached files.
- No documents: reply only "No documents came through. Attach the PDFs or paste their text and send again." Never invent documents or values.
- No columns: reply only "No columns came through. List the columns you want, one per line, and send again."
- No row setting: one row per document.
- No carry-over, or "none": this is part 1.
- Pasted text with no file names: name the documents Doc 1, Doc 2, and so on, in the order pasted.

## 3. What to pull out
For each column: the value as printed, the page (or section, for documents without page numbers) it came from, and the exact words when it needs a check.

Edge cases:
- A scanned page or image-only PDF: read it if you can read images, with Confidence at most Medium. If you can't, give the file a row with Status "Unreadable" and every value "Unclear", and list it.
- A protected, corrupt or empty file: a row with Status "Unreadable", listed.
- Missing pages (page numbers jump, or "page 3 of 5" in a 2-page file): fill what is there, Status "Incomplete", and say which pages are missing.
- A file that isn't the expected kind of document: a row with every value "Not found", Status "Incomplete", and "Not a <kind of document>" in Notes.
- A column that doesn't apply to that kind of document (no order number on a till receipt): "N/A", which doesn't make the row Incomplete.
- One file holding several records (several invoices in one PDF): one row per record, each with the same file name and its own pages.
- The same field with two different values in one file: use the one from the summary, final or signed part (a totals box over a figure in the text; an amended version over the original), set Status "Check", and give both values with their pages in Notes.
- The same document twice (the same key from a different file, or identical files): keep both rows, and set Status "Duplicate of #<row>" on the one with the higher row number. Rows from the same file that share a key, such as the line items of one invoice, are never duplicates of each other. The key is the first requested column that identifies a document (such as an invoice or contract number); if there is none, the first three requested columns together.
- A date that could be read two ways (03/04/2026): decide from other dates in the same document, its country or its currency. If still unsure, write your best reading, set Status "Check", and quote the original in Notes.

## 4. Steps
1. List the files in name order (A to Z) and number them 1, 2, 3. If there is a carry-over, apply the continuing rule in part 5. Decide this part's files.
2. Define each column (part 6, section 2): a plain meaning, a type and a format. Where the person gave only a name, write the likeliest meaning and mark it "(definition assumed)".
3. For each file in this part, find every column's value and its page, then apply the edge cases in part 3.
4. Apply the format rules, then run the arithmetic check on documents with stated totals.
5. Flag duplicates (against the carry-over's keys too), write the output, then run the self-check.

## 5. Rules
- Copy values. The only changes allowed are the format rules below (dates, numbers, signs, units) and the flagged best reading of an ambiguous date. Never calculate a value, fill one in from another document, or guess. A value that isn't in the document is "Not found"; one that is there but unreadable or ambiguous is "Unclear"; one that doesn't apply is "N/A". No cell is ever blank.
- Formats: dates as YYYY-MM-DD; numbers plain, with a dot for decimals, no thousands separators and no symbols, with a minus sign for negatives (credit notes, amounts in brackets); yes-or-no columns as Yes or No; text as printed, trimmed. Value cells hold only the value: no page, note or unit.
- Money: never convert currencies. If the whole stack uses one currency, put its code in the column name, as in "Total (EUR)". If it mixes currencies, add a "<column> currency" column with the three-letter code beside each money column.
- Units: convert to the unit most of the documents use, only where the conversion is exact (grams to kilograms), and note it in the header.
- Source: every row has one Source column listing the page of each value, as in "Invoice date p.1; Total p.2". Values marked Not found or N/A have no page.
- Status per row: "Complete" (every value found or N/A), "Incomplete" (any Not found or Unclear), "Check" (a conflict, an uncertain date or a failed arithmetic check), "Unreadable", or "Duplicate of #<row>". If several apply, list them separated by " · ".
- Confidence per row: High (every value read from clear printed text), Medium (any value read from a scan or handwriting, or a format judgement), Low (Status includes Check, or any value is Unclear).
- Notes: for every Unclear or Check value, the column, the page and the original words (at most 12), and both values for a conflict.
- Arithmetic check: where a document states line items and a total, or a subtotal, tax and total, check the sum. A difference over 0.01 sets Status "Check", with both figures in Notes. For a document split across parts, run the check in the part that holds its stated total, using the "subtotal so far" carried in the carry-over line next to that file's next record.
- Parts: the table always goes in the reply, so each part is at most 10 files, about 100 pages and 40 table rows, whichever comes first. Rows are numbered on from part to part. <P>, the number of parts, is your estimate from the stack; update it in later parts if it changes, and say so in the header.
- One file with more than 40 records (or more than about 100 pages): split it across parts at a record boundary, never inside a record. Number its records 1, 2, 3 in the order they appear. This part ends after the record that brings it to 40 rows, and the next part starts at the next record of the same file. The header says "file <n>, records <a>–<b>"; the file counts as read, and its page, unreadable and no-values status is settled, only in the part where its last record is done.
- Continuing in the same chat: when the person replies "continue", do the next part with the same columns and rules, check duplicates against every earlier row, and keep the run summary's totals for all parts so far.
- Continuing in a new chat: read the carry-over line (part done, files total, next file and record, next row, totals so far, keys seen with their rows and files). This part is the next part number, and <N> is the files total. If the files attached number at least the "next file" number, skip the files numbered before it; if fewer are attached, they are the remaining files, so number them from it. If the line says "from record <k>", start that file at record <k>. Number rows from "next row", check duplicates against "keys seen" (in <key>#<row>@<file>, the number after # is its row, for "Duplicate of #<row>", and the number after @ is its file, so rows from the same file are never duplicates), and add this part's counts to every carry-over total, keeping the named files. The spreadsheet in a new chat holds this part's rows only.

## 6. Output
Use these sections in this order. Write "None" under any that is empty.
1. **Header**: what was extracted and what one row stands for; "Part <p> of <P>: files <a>–<b> of <N>" (or "All <N> files in one part"), with "file <n>, records <a>–<b>" when a file is split; the currency and unit notes; any assumption; and the line "Before sharing this table, remove any personal or financial details the reader doesn't need."
2. **Columns**: a table with the columns Column | Meaning | Type and format | Where it's usually found. In later parts, write "Same columns as part 1".
3. **The table**: one Markdown table with the columns Row | File | each requested column, in the person's order (with any currency column beside its money column) | Source | Status | Confidence | Notes. The header appears once. Every file in this part has at least one row.
4. **Flags**: one line per row whose Status is Check, Incomplete, Unreadable or Duplicate: the row, the file and what is wrong, pointing to its Notes.
5. **Run summary**: files listed; files in this part; files read; files unreadable (named); files with no values found (named); rows made; values found, Not found, Unclear, N/A and Check, counted; arithmetic checks passed and failed. After part 1, the same counts for all parts so far.
6. **Spreadsheet**: if you can create files, build it with code and attach it as extracted-table.xlsx (extracted-table-part<p>.xlsx for a later part; in the same chat it holds every row from part 1 on, in a new chat this part's rows only). It has the tabs Table (exactly the columns of section 3; real date and number cells; header row frozen; filters on), Columns, Flags and Summary. If you can't create files, write "Your app can't make the file here. Copy the box below into a file named extracted-table.csv, or paste it into a spreadsheet." and give the rows of this part as CSV in one code block, with exactly the columns of section 3, every field holding a comma or quote wrapped in double quotes, and inner quotes doubled. The header line goes in part 1 only; later parts add "Paste these rows under the last row."
7. **Next**: if files remain: "Part <p> of <P> done: files <a>–<b> of <N>. To continue here, reply: continue. To continue in a new chat, paste this prompt again, attach the remaining files, and put this line in Carry-over:" followed by one line in a code block, with every total counted over all parts so far:
   "done part <p> of <P> · files total <N> · next file <n> (add "from record <k>, subtotal so far <amount>" when that file was split) · next row <r> · totals: files read <n>, unreadable <n> (<their names, or none>), no values found <n> (<their names, or none>), rows <n>, found <n>, Not found <n>, Unclear <n>, N/A <n>, Check <n>, arithmetic passed <n>, arithmetic failed <n> · keys seen: <key>#<row>@<file>, <key>#<row>@<file>, …"
   These are exactly the fields a new chat needs to fill the header and every run-summary count. If there are more than 100 keys, give the last 100 and say "duplicate check covers the last 100 keys only". If none remain: "All <N> files done."

## 7. Self-check
Before replying, check each of these and fix any failure:
- Every file in this part has at least one row, and this part's files equal the files read in it plus the files unreadable in it plus any split file still in progress.
- Every row has the file name, a value or a marker in every column, and a Source entry for every value found; no cell is blank, and no value cell holds a page or note.
- Every value can be found on the page given, word for word or changed only by the format rules; nothing is calculated or guessed.
- Every date is YYYY-MM-DD and every number follows the number rule; no column mixes currencies or units.
- Every conflict, uncertain date, failed arithmetic check and duplicate (including against earlier parts or the carry-over keys) has its Status and its line in Flags.
- The counts in the run summary match the table, and after part 1 the totals include the earlier parts.
- The part stays within 10 files and 40 rows (a file with more than 40 records is split at a record boundary), and the rows are numbered on from the last part.
- The spreadsheet file or the CSV holds exactly the rows the rules above say, with the same columns and values as the table.
- The Next section gives the right file, record and row numbers and, if files remain, a complete carry-over line: the part done and <P>, the files total, every run-summary total for all parts so far (with the unreadable and no-values files named), every key with its row and file, and the running subtotal of any split file.
Then reply with the output only, ending with one line: "Checked: <n> files, <n> rows, <n> Not found, <n> Unclear, <n> flagged, part <p> of <P>."

## 8. Setup
Works as one paste in any chat app that takes file attachments. Attach the PDFs and leave "see attached" in the documents block. Where the app can create files, you get an .xlsx to download; where it can't, you get CSV to save or paste into a spreadsheet. A long stack comes back in parts: reply "continue" for the next one in the same chat, or start a new chat with the remaining files and paste the carry-over line the reply gives. A single file with more than 40 records is split across parts too. Remove or cover personal and financial details you don't need before uploading.
Community experience

Reader reviews

Ratings describe signed-in readers’ reported experience with this skill version. They do not verify generated-result quality, installs or completed work. Names and task details are not published.

Loading reviews…

Sign in to submit, report or manage a public review. Browsing and using skills stays free of account requirements.

Report a problem privately
Help improve this skill

How did it go?

Send only this skill’s version, the step and your verdict. No task details, prompts or results are sent. These reports guide editorial review; they are not public ratings.

FAQ

What do I need before using this recipe?

Bring The PDFs; The columns you want. Read any conditional requirements and the complete input list below.

How do I check the XLSX result?

Compare the draft with this version’s result checklist and your source facts. Retrieval, copying and a file download do not establish a correct result.

How do I start?

Copy the prompt and paste it into your assistant. Answer the questions there. Your assistant creates the result; review it before using it.

Do I need an account or an MCP connection?

No account or MCP connection is needed to copy. Connect LazyCoder to Claude once if you prefer retrieval.

Where do my details go?

Give task details to your chosen assistant. Optional preparation here stays on this device; the MCP starter contains public skill identity only.