Skip to content
ignitai
← Back to blog 13 min read

Convert invoice PDF to Excel on Mac — batch, PDFs stay on your Mac

Batch a folder of vendor invoice PDFs into one Excel workbook on Mac — read on-device; only the text is uploaded — line items, tax rates, and totals that reconcile.

Turn your invoices into a clean spreadsheet with ignitai on your Mac — first document free (up to 4 pages), then $29.99/month (USD).

Get ignitai on the App Store

You have forty vendor invoices in a folder on your Mac. Some came from suppliers’ billing portals, some forwarded from Gmail, some saved out of OneDrive by a contractor who insists on PDFs. Your accountant wants them in a single Excel sheet — line items in one tab, header metadata in another, totals reconciled, tax broken out by rate. The deadline is Friday. You’re at the desk because this is a desk job: forty invoices is a Mac batch, not an iPad share-sheet flow.

The single-vendor case is easy. The batch case is what eats Tuesday afternoon. Templates differ. One supplier puts the PO number top-right; another buries it in the line-item description. Half the invoices are clean text PDFs; a third are scans of paper invoices a contractor mailed in. Two are password-protected because the supplier’s billing system encrypts everything.

This guide is the Mac-native version of that workflow: convert invoice PDFs to Excel on Mac, in batch — invoices read on-device, only the text sent to ignitai’s servers — with one consolidated XLSX and totals that reconcile against each invoice’s printed grand total.

In this guide14 sections

Why Mac (not iPad) for invoice batches

The iPad invoice walkthrough exists for the case where one invoice arrives in Mail and you process it on the device that’s already on. The Mac version exists for the batch — the month-end stack, the audit prep, the contractor reconciliation. Three reasons the Mac wins for the multi-invoice case:

  • Drag in the whole batch. Open the folder, select all (Cmd-A), and drag forty invoices in one drop. Mobile share sheets handle a few PDFs at once; forty at a time is a Mac job.
  • Big screen for the spot-check pass. A 27” display with the consolidated Excel sheet on one half and the original invoice PDFs on the other makes the three reconciliation checks (line totals, tax, vendor name) take seconds per invoice rather than minutes.
  • Your invoices are read on your Mac, not uploaded. ignitai runs document recognition on-device — the PDFs never leave the machine — and sends only the recognized text to its servers to build the sheet.

On macOS 26, Apple’s newest on-device document recognition reads invoice tables natively, which makes line items extract noticeably sharper. On older versions (back to macOS 14.4), the same flow works with Apple’s classic on-device text recognition.

Why XLSX (not CSV) is the right output for invoices

For bank statements the right answer is CSV — the destination is QuickBooks or Xero’s bank-import flow, which strips formatting and wants a flat list of transactions. Invoices are different. The destination is usually the spreadsheet itself: a workbook your accountant or AP system uses to track payables, run pivot tables on vendor × month × tax_rate, and reconcile against POs (extracted the same way — see the purchase-order-to-Excel guide) or, for freight invoices, against the tendered shipment (the bill-of-lading-to-Excel guide builds that side). XLSX is the right format because:

  1. One sheet straight into the AP workbook. The extraction lands as rows you drop into the payables workbook you already keep — line items with the invoice number and vendor repeated on each row, ready for vendor × month × tax_rate pivots. CSV means an import step first.
  2. The workbook’s formats do the typing. Currency on amounts, percentage on tax rates, ISO dates on issue/due dates — set them once in the AP workbook and pasted rows inherit them. CSV round-trips make the receiving spreadsheet re-infer types every time.
  3. Formulas survive. A =SUMIFS in the workbook that reconciles line-item totals against printed grand totals is a one-time setup; each month’s appended rows flow straight into it.
  4. Excel and Numbers both open it cleanly. No encoding question, no “treat first row as header?” prompt, no quoted-string quirks.

For invoices destined for bookkeeping review, XLSX is what you want. CSV is fine if you’re piping into a script.

Why invoice PDFs are harder than they look

“Invoice to Excel” sounds like one problem. It’s actually four, and most converters only handle the first:

  1. Header metadata. Invoice number, issue date, due date, PO number, vendor name and address, your billing address. These are scattered across the top third of the page in boxes, not in a table. A generic table extractor skips them or smashes them into the line-item grid.
  2. Line items. The actual table: description, quantity, unit price, line total, sometimes tax per line, sometimes a discount column. Templates vary wildly between vendors — even two invoices from the same supplier can diverge if they updated their billing software midway through the year.
  3. Totals block. Subtotal, tax (often split across multiple rates — standard VAT, reduced VAT, zero-rated), shipping, discounts, grand total. Visually this is a small table; structurally it’s a set of key-value pairs that need to land in specific columns alongside the line items.
  4. Payment terms and footer. Bank details, payment reference, late-fee policy. Usually irrelevant for bookkeeping export, but sometimes you need the payment reference in a separate column for AP matching.

A tool that grabs “all the tables” gives you a mess. A tool that understands an invoice as an invoice puts header metadata in normalized columns, line items in their own rows with an invoice_id foreign key, and totals in a reconciled summary. That’s what you want exported to Excel — because the whole point of consolidating is the pivot tables.

Method 1: ignitai on Mac (read on-device)

ignitai handles invoice extraction as a language task, not a table-coordinate task. The full Mac batch flow:

  1. Select the invoices in Finder (⌘A) and drag them into ignitai. They queue as a single batch. Mixed text-PDF and scanned-PDF inputs are fine; the app routes each file through the right pipeline automatically.

  2. Describe what to extract, once for the whole batch. Plain English. The prompt that works for almost every standard US/EU vendor template:

    “For each line item, return invoice_number, vendor_name, description, quantity, unit price, line total, and tax rate. Repeat the invoice-level fields — issue_date (ISO 8601), due_date (ISO 8601), po_number, subtotal, total_tax, and grand_total — on each row.”

    Save it as a preset. Next month it’s one click.

  3. Pick XLSX as the output format. One consolidated sheet, one row per line item, with the invoice-level fields repeated on each row — and amounts as real numbers, so the line totals sum as soon as the file opens in Excel.

  4. Hit Convert. ignitai reads each PDF on-device and builds the workbook. Each file shows its status as the batch runs, and a notification arrives when the workbook is ready. The page count shows before you start: forty one- or two-page invoices fit inside the plan’s 80 pages a week, and a longer stack draws on extra pages.

  5. Review the consolidated workbook. The invoice_number and vendor_name on every row tie each line back to its invoice — filter by either to spot-check one vendor without reopening the PDFs. Open in Excel for Mac or Numbers for review.

  6. If the batch trips, fix and re-run. A corrupted, password-protected, or blank-scan PDF stops the job. Unlock or fix the offending file and run the batch again.

The invoice files never leave your Mac — they’re read on-device, and only the recognized text goes to ignitai’s servers.

Method 2: tabula-py + a Python script (the DIY path)

If your invoices all come from one supplier with a stable template and you want to own the pipeline:

brew install openjdk       # tabula-py bundles the tabula-java jar but needs a Java runtime
pip install tabula-py pandas openpyxl

Then a script that opens each PDF, extracts the line-item table, and writes one consolidated XLSX with line-item and header sheets:

import tabula, pandas as pd
from pathlib import Path

line_items, headers = [], []
for pdf_path in Path("./invoices").glob("*.pdf"):
    tables = tabula.read_pdf(pdf_path, pages="all", lattice=True)
    for tbl in tables:
        tbl["source_file"] = pdf_path.name
        line_items.append(tbl)
    # header metadata: separate parsing pass needed (text extraction + regex)

with pd.ExcelWriter("invoices.xlsx", engine="openpyxl") as writer:
    pd.concat(line_items).to_excel(writer, sheet_name="line_items", index=False)
    pd.DataFrame(headers).to_excel(writer, sheet_name="invoices", index=False)

This works for one supplier, one stable template, all text-based PDFs with a lattice (drawn-line) layout. It breaks the moment any of the following happens:

  • The supplier changes its template. tabula infers grids from drawn lines; a redesign re-anchors the grid and column order shifts silently.
  • One invoice is a scan. A contractor mailed in a paper invoice they photographed; tabula returns nothing. You’d layer in pytesseract and accuracy collapses on dense line-item tables.
  • Multi-line descriptions. A SKU on one line and a model number on the next becomes two rows in your sheet unless you write join logic per template.
  • Header parsing. tabula extracts tables. Invoice numbers, dates, and vendor blocks need a separate text-extraction pass with vendor-specific regex per supplier.

For one-vendor stability, the script is a one-time cost. For real-world AP across a small business with twenty different suppliers, the maintenance burden eats the savings.

Method 3: Preview + Numbers (the no-install fallback)

For one clean text-based invoice you don’t want to install anything for: open the PDF in Preview, select the line-item table, Cmd-C, paste into Numbers, split the columns by hand (Numbers has no Text to Columns command — Excel’s Data → Text to Columns is the tool if you’d rather not do it manually), type header metadata into a separate sheet, then File → Export To → Excel. Works only on clean grids — multi-line descriptions, merged cells, or any scan and the paste lands as a mashed string. For repeat AP work, save the preset in Method 1.

Method 4: Web converters (and why not for invoices)

Half a dozen “PDF invoice to Excel” web tools exist. The reasons not to use them for live AP from a Mac, checked against current terms as of September 2026: you’re uploading the whole file, supplier bank details and pricing included, to a server you don’t control; free tiers gate hard — Smallpdf allows two tasks per day before its $15/month Pro plan, and iLovePDF’s free tier caps file count and size similarly; invoice-aware extraction is rare, so generic converters return the detected grid and miss the header-vs-line-item separation and multi-rate tax breakouts; and the invoice-specific services price per document or per monthly volume, which adds up to a recurring fee in exchange for uploading your AP to a third party. ignitai is a subscription too, and it sends less, not nothing: the invoice PDFs stay on your Mac, while their recognized text goes to ignitai’s servers and the finished file stays in your ignitai account until you delete it.

The three reconciliation checks, on Mac

Once the workbook is written, three checks separate “I have a file” from “I have an audit-ready AP sheet”:

  1. Line-total reconciliation. For each invoice, sum its line_total rows — =SUMIF(invoice_number_range, "INV-2041", line_total_range) — and compare against the subtotal repeated on those rows (and the printed subtotal on the PDF). Any divergence means a line was missed, duplicated, or misread. This single check catches almost every extraction error.
  2. Tax-rate sanity. Group line items by tax_rate. Each group’s line_total summed and multiplied by the rate should equal the tax broken out for that rate in the totals block. For multi-rate invoices (say, standard VAT and reduced VAT), this is the only way to catch a line item that landed under the wrong rate.
  3. Vendor name normalization. Sort the sheet by vendor_name. Look for duplicates that differ only in punctuation or whitespace — “Acme, Inc.”, “Acme Inc”, “Acme Inc.” — and pick one canonical spelling. Push the rule into the saved prompt for next month: “Normalize vendor names: ‘Acme, Inc.’ and ‘Acme Inc’ are ‘Acme Inc.’”

Skip these three and the AP error surfaces during reconciliation, when one invoice is over-paid by $47.83 and you have no idea which.

Importing the XLSX into your accounting tool

Most small-business accounting tools have an Excel-import path for AP. The flow is similar across them.

QuickBooks Online (Bills import):

  1. Expenses → Bills → Batch upload.
  2. Drag the XLSX from Finder.
  3. Map columns: vendor_name → Vendor, invoice_number → Bill no., issue_date → Bill date, due_date → Due date, grand_total → Amount. Leave the extra audit columns unmapped (or import as Memo for the audit trail).
  4. Review the preview, accept.

Xero (Bills CSV/XLSX import):

  1. Business → Bills to pay → New → Upload.
  2. Pick the XLSX.
  3. Map the same fields. Xero can read the line-item rows too if you select “Import line items” in the upload dialog.
  4. Confirm and post.

Wave, FreshBooks, Zoho Books: all accept XLSX imports for bills. The column-mapping step is the same idea everywhere — your XLSX has the columns the tool wants, plus a few it doesn’t, and you skip the extras.

Batch mode at month-end: the actual workflow

The full month-end loop, end to end:

  1. In Finder, gather all the invoices that landed in the month into one folder — if they’re sorted into subfolders by supplier, ⌘A inside each and add them to the same batch.
  2. Select the invoices and drag them into ignitai.
  3. Apply the saved prompt preset.
  4. Pick XLSX.
  5. Convert.
  6. Run the three reconciliation checks above.
  7. Upload the XLSX to QuickBooks / Xero / your AP tool.
  8. Archive the source folder to iCloud Drive or your accounting-tool’s document store, with the consolidated XLSX next to it.

For a month of forty invoices, this is the difference between Tuesday afternoon and twenty minutes after the second espresso.

When this workflow doesn’t fit

Honest edge cases:

  • Invoices that arrive as EDI or XML (EDIFACT, UBL, PEPPOL). Don’t extract from PDF — your accounting tool’s e-invoicing connector parses the structured payload directly. PDF extraction is for the PDF-only suppliers, which in 2026 is most small vendors but rarely large ones.
  • Subscription invoices that are really receipts. Stripe, AWS, Google Workspace, Apple Developer all have CSV exports under their billing portals. Use those. Extracting from a hundred Stripe receipt PDFs when Stripe will hand you one CSV is a workflow built backwards.
  • Multi-page invoices with a continuation table. Tighten the prompt: “line items continue across pages until the totals block; do not treat each page as a separate invoice.” Save the preset, batch the rest.

Which method for which job

SituationUse
One clean text-based invoice, nothing installedPreview copy-paste into Numbers, split columns by hand
One supplier, one stable template, text PDFs onlytabula-py + pandas script — a one-time cost you maintain
Tutorial or synthetic invoices with no real dataA web converter, within its free-tier limits
Month-end batch: many vendors, scans, mixed templatesignitai on the Mac — read on-device, one consolidated XLSX
Invoices arriving as EDI/XML (UBL, PEPPOL)Your accounting tool’s e-invoicing connector, not PDF extraction

Bottom line

For a folder of vendor invoice PDFs that needs to end up as one Excel workbook on Mac, ready for QuickBooks, Xero, or your AP system: install ignitai, select the invoices and drag them in, write the prompt once, pick XLSX, hit Convert, run the three reconciliation checks. For a single one-supplier stable workflow you want to own end-to-end, a tabula-plus-pandas script is a valid alternative if you don’t mind maintaining the per-template parsing. For everything else — multiple vendors, scans, mixed templates, anything you’d rather not upload — the on-device Mac batch is the shortest distance from invoice folder to AP-ready workbook.

The single-invoice iPad walkthrough is in the iPad invoice guide; the parallel bank-statement Mac flow (CSV instead of XLSX, transactions instead of line items) is in the Mac bank-statement guide; the broader Mac batch pattern across mixed document types is in the Mac batch guide; and when the question is which invoices are still unpaid and how late, the aging-report Mac guide covers the AR and AP aging side. Same app, same presets, same iCloud-synced output. The Mac is the desk batch surface; the mobile devices handle capture as invoices arrive.

Get ignitai on the App Store — free download; your first document (up to 4 pages) converts free with Sign in with Apple, and one subscription covers iPhone, iPad, Mac, and Vision Pro.

FAQ

How do I extract invoice line items into Excel on a Mac?

Drop the invoice into ignitai, ask for the line items — date, description, quantity, unit price, line total — pick XLSX, and hit Convert. Each field lands in its own column and the amounts are real numbers, so a =SUM() under them ties out against the printed total the moment the file opens.

Can I batch a folder of invoices into one spreadsheet?

Yes — select all the PDFs and drag them in as one job with one prompt. The output is a single workbook, one row per line item, with the invoice number and vendor repeated on each row so every line traces back to its invoice.

Do the invoices get uploaded?

No — each invoice is read on the Mac (macOS 14.4 or later) and never uploaded. Only the recognized text goes to ignitai’s servers to build the workbook.