Ildana

paperless-export

The document list you see in paperless-ngx, as a sheet you can hand to someone. One command against your own instance writes a CSV, XLSX, JSON or JSONL of exactly what a filter or a saved view shows on screen — custom fields as columns, totals if you want them, the matching PDFs beside it if you ask. Read-only by construction.

Get it on GitHub The request it answers

The problem

paperless knows every invoice, its correspondent, its amount, its tags. At tax time you want that list on a sheet — and there is no button. "Export document list as CSV" has been an open request since 2022 and the one attempt to build it in was turned away. paperless's own exporter is a whole-archive migration dump, not a list. So people copy cells out of the browser by hand, or write a script that quietly drops the custom fields.

How it works

paperless-export talks to your instance over the same API the web app uses, reads the custom fields your instance defines, and writes the sheet. Then it does the thing a sheet needs: it asks paperless how many documents match and refuses to finish unless the row count agrees. A sheet you cannot check is worse than no sheet.

paperless-export --tag Invoice --created-from 2025-01-01 -o invoices --format xlsx
paperless-export --view "Tax Invoices 2025" --sum Amount -o tax-2025   # a saved view, as shown, with a totals row
paperless-export --tag Tax --pack -o tax-2025   # the sheet plus every matching PDF in a folder beside it

Your token comes from the environment, never a flag, never a file the tool writes. Plain http is refused to anything outside your own network, redirects that leave your instance are refused, and no endpoint that writes is ever called.

Three ways to run it

From the terminal, as above. As a form in your browser with --serve — one page on 127.0.0.1, one session, one link that works once, and the token never enters the browser because the export still runs in the command you started. Or as a single HTML file on a machine with no Python at all: it talks to paperless from the tab, and the README says exactly what that costs and how to keep it tight.

Get it

Clone the repository — Python 3.10 or newer, MIT licensed, tests included, runs on Windows, Linux and macOS. Found a filter it does not know or a column it placed wrong? Open an issue.