PDF tables to ExcelDevelopment & Customization

A Python script that pulls the tables out of your PDF reports, price lists or statements into Excel

Usually ready in 15 minutesRevisions includedQuality check
Packages
Payment protectionDetails
  • Revisions within the package are free.
  • If you do not respond within 3 days of delivery, the work is accepted automatically.

The money is reserved when you pay and released only once you accept the work.

A Python script that pulls the tables out of your PDF reports, price lists or statements into Excel

Example result

Example for the Standard package

Merging the monthly sales files of 9 shops into one Excel report

How it is run

python merge_sales.py --month 2026-10
2026-11-02 09:14:03 INFO  Folder: sales/2026-10, 9 files found
2026-11-02 09:14:03 INFO  shop-01.csv: 1,284 rows
2026-11-02 09:14:04 INFO  shop-02.xlsx: 967 rows
2026-11-02 09:14:04 WARN  shop-07.csv: 3 rows without a price skipped (lines 88, 412, 913)
2026-11-02 09:14:05 INFO  Done: 10,412 rows -> report-2026-10.xlsx (sheets "Sales" and "Totals")

Settings, not code

The column names of each shop live in settings.ini, so a new shop or a renamed column is a line there:

[columns]
date = Date, Sale date, Day
product = Product, Item, Name
quantity = Qty, Quantity, Pcs
price = Price, Unit price

A part of the code

def read_shop_file(path: Path, columns: dict[str, list[str]]) -> pd.DataFrame:
    """Reads one shop's file and gives it the report's column names."""
    table = pd.read_excel(path) if path.suffix == ".xlsx" else pd.read_csv(path, encoding="utf-8-sig")
    renamed = {}
    for name, variants in columns.items():
        found = next((c for c in table.columns if c.strip() in variants), None)
        if found is None:
            raise ReportError(f"{path.name}: no column for '{name}' (looked for {', '.join(variants)})")
        renamed[found] = name
    table = table.rename(columns=renamed)[list(columns)]
    table["shop"] = path.stem
    return table

Files: a ZIP archive with merge_sales.py (310 lines), settings.ini, requirements.txt and a README with installing Python, running the script and what each message in the log means. The client runs it on their own computer.

Client: a small chain of 9 stationery shops; each shop sends its sales for the month as a CSV or Excel file, with slightly different column names. Task: one script that reads every file in a folder, brings the columns to one shape, and writes a single Excel report with all sales and a sheet of totals by shop.

The client and all details are made up.

About this service

Supplier price lists, bank or marketplace reports and stock lists often come only as PDF, and copying their tables into Excel breaks the columns. This Python script reads the tables of your PDFs and writes them into Excel or CSV with the columns in place: it joins a table that runs over many pages, drops repeated header lines and page footers and, from Standard, turns 1 234,50 or (120.00) into real numbers and dates into dates. It is tuned to the layout of your files, so send one or two typical PDFs or the same layout with made-up figures. The PDF must contain real text, as most files saved from a program do; scans and photos of paper need text recognition, which is not included. You run the script yourself and check the totals.

What is included

  • What you getA ZIP archive with the Python script, a README with step-by-step instructions and, from Standard, a settings file with column names and pages; the code is also shown on the order page.
  • Tuned to your layoutBuilt and tried on the sample files you send
  • Columns in placeOne row in the PDF is one row in Excel
  • Many pages joinedA long table becomes one sheet without repeated headers
  • Real numbersFrom Standard, amounts and dates you can sum and sort
  • Readable codeWith comments, easy to adjust if the layout changes

How it works

  1. 1
    SamplesYou send one or two typical PDFs and show the table you need
  2. 2
    CodeWe write the script for that layout and the guide to running it
  3. 3
    Try itYou run it on your files and check the totals against the PDF
  4. 4
    ChangesYou ask for changes within your package and send any error message

What we need from you

One or two typical PDFs of the kind you get (or the same layout with made-up names and figures), which table on which pages you need, and the columns you want in Excel. How numbers are written in them (commas, spaces, minus signs or brackets) and the date format. Whether all your files share one layout or there are several kinds, roughly how many files you process, and your system: Windows, macOS or Linux.

We will ask you:

  • What are the PDFs?
  • Which columns do you need in Excel?
  • Do all your files look the same?
  • Where will it run?

Compare packages

PackagesBasicOne table layout$16StandardTables with settings$33PremiumTable tool$67
Deadline1 day2 days3 days
Revisions123
Codeup to 150 linesup to 400 linesup to 1,000 lines
Files of code1up to 3up to 8
Settings fileNoYesYes
Clear error messages and a logNoYesYes
Run options and a guide to running it on a scheduleNoNoYes
Guide to installing and running it (README)YesYesYes
LanguagePythonPythonPython
Order BasicOrder StandardOrder Premium

Payment protection

You pay when you order, but the money is released only for accepted work.

  • Fixed priceThe package price does not change after you pay.
  • The money is reservedWhen you pay, the amount is only reserved. It is released to the service once you accept the work.
  • Checked before deliveryEvery result goes through a quality check before it reaches you, and you see it on the order page before accepting it.
  • Free revisionsAsk for changes within your brief as many times as the package allows.
  • Acceptance after 3 daysIf within 3 days of delivery you neither accept the work nor ask for changes, it is accepted automatically. If you write in the order chat after delivery, the order waits; once we answer, we may start the 3 days again and will say so in the chat.
  • Redo or a full refundIf the result does not match your brief and the revisions did not fix it, or the work takes more than twice its deadline, write in the order chat: we will redo the work or refund the payment in full.
How it works →

Questions and answers

Will it work with any PDF?

It is made for the layout of your sample files. If your supplier changes the layout, the script may need adjusting. PDFs without real text, such as scans, are not covered.

How do I know whether my PDF has real text?

Open it and try to select a word with the mouse. If you can select and copy it, the text is real. If the whole page selects as one picture, it is a scan.

Can it be wrong?

Yes, PDF tables are not stored as tables, so an odd line can break a row. That is why the script logs pages it was unsure about, and you should check the totals against the PDF before using the result.

Do I have to send real reports?

No. The same layout with made-up figures works just as well, and the script then runs on your real files on your computer.

Did not find your answer?

Packages