PDF to Excel Converter: Extract Tables to XLSX Free

📄 File and Document Free Forever

PDF to Excel Converter

Extract tables from a PDF straight into a real .xlsx spreadsheet, with an optional CSV export too. Reads exact text position on each page to rebuild rows and columns, supports password protected PDFs, entirely in your browser.

1 · Upload PDF
📈

Click or drop a PDF with tables

Text-based PDFs · processed on your device, never uploaded

2 · Options

Column detection is automatic, based on text alignment. Ruled tables and cleanly aligned columns extract best; heavily merged cells may need cleanup in Excel.

About This Tool

How this PDF to Excel converter reconstructs tables from a format that has no concept of a table

A PDF page does not store rows and columns. Under ISO 32000, the format that defines PDF, a page is a stream of positioned text showing operators, each one saying draw this string at this exact x and y coordinate in this font. There is no cell, no row, no grid, nothing that tells a parser two pieces of text belong in the same table. This tool has to look at where hundreds of text fragments land on the page and infer the grid a human eye would see instantly.

Parsing happens with pdf.js, the PDF renderer Mozilla built for Firefox, running entirely in your browser. The spreadsheet is then built with SheetJS (the xlsx library). No file is ever uploaded. The whole conversion, from opening the PDF to writing the final .xlsx or .csv, happens in JavaScript on your machine.

The row and column reconstruction algorithm

Every page goes through the same three stage geometric clustering before a single cell is written.

Step 1 Row clustering pdf.js’s getTextContent() returns every text fragment with a transform matrix, and the fifth value in that matrix is the fragment’s baseline Y position. Fragments whose Y values sit within roughly a third of the text height of each other get grouped into the same row.
Step 2 Column bin detection Every fragment’s X start position across the whole page is sorted, and a new column bin is opened whenever the gap between consecutive X values exceeds a threshold that scales with the average font height. This is what tells the tool where one column ends and the next begins, without any prior knowledge of the table’s structure.
Step 3 Cell assignment Each row’s fragments are sorted left to right, then dropped into whichever column bin their X position sits closest to. Fragments landing in the same bin get joined with a space, which is how multi-word cell contents are recovered.
Step 4 Empty column pruning and number detection Column bins that never received any text on the whole page get dropped from the final grid. If the numeric detection option is on, each remaining cell is checked against a pattern that strips currency symbols, commas and percent signs, and converts what is left into a real spreadsheet number rather than text.
// row grouping by baseline Y, simplified from the tool source items.forEach(function (it) { var y = it.transform[5], h = it.height || 10; var row = rows.find(function (r) { return Math.abs(r.y – y) < Math.max(2.5, h * 0.35); }); if (!row) rows.push(row = { y: y, items: [] }); row.items.push(it); }); // column bins from x-start clustering var gapMin = Math.max(8, avgFontHeight * 1.1); if (xs[i] – cols[cols.length – 1] > gapMin) cols.push(xs[i]);

Because the row and column boundaries are derived from geometry rather than a real table object, borderless tables and tables set with inconsistent spacing can still confuse the grid. Well aligned tables from spreadsheet exports or invoices tend to reconstruct almost perfectly, since their columns share exact X coordinates across every row.

Multi-page handling and output formats

You can restrict extraction to a page range using the same comma and hyphen syntax as a print dialog, for example 1-3, 7. Every selected page runs through the grid reconstruction independently, on its own promise chain, so a 40-page PDF does not block the browser tab while it works.

Output layoutWhat SheetJS builds
One sheet per pageEach page becomes its own worksheet, named “Page 1”, “Page 2” and so on, inside a single .xlsx workbook
Combined into one sheetAll page grids are concatenated with a blank spacer row between them
CSV exportEach sheet is converted with XLSX.utils.sheet_to_csv and joined with a blank line between pages
Skip empty pagesPages where every extracted cell is blank are dropped from the output entirely
Scanned PDFs will not extract. If a page is a photographed or scanned image with no embedded text layer, getTextContent() returns nothing to cluster, and the tool flags a low-character warning. This is a text extraction tool, not OCR. A scanned invoice needs an OCR pass before any geometry-based table reconstruction can work on it.

Two details worth knowing

Currency and percent coercion

With number detection on, a cell reading $1,234.56 becomes the number 1234.56, and a cell reading 45% becomes 0.45, matching how Excel itself stores percentages internally as a fraction with a display format on top.

Sheet name length limit

Excel’s OOXML format caps worksheet names at 31 characters. The tool truncates any page label to fit before calling book_append_sheet, so long source filenames never cause a silent write failure.

pdf.js text layer parsing Geometric row and column clustering SheetJS .xlsx and .csv output

Extraction libraries and standards

Table extraction in practice

Pulling a pricing table out of a supplier’s PDF quote, converting a bank or brokerage statement into a spreadsheet for reconciliation, lifting a schedule or roster out of a printed PDF handout, and rescuing tabular data from an old report that only exists as a flattened PDF export. Anywhere a table was baked into a PDF and you need it back as real, sortable spreadsheet rows, this is the shortcut around retyping it by hand.

Common Questions

FAQ: PDF to Excel Converter

Upload your PDF, set the page range you want converted, and click Convert to Excel. The tool reads the exact position of every piece of text on the page, groups it into rows and columns, and writes the result into a downloadable .xlsx file, with a CSV option alongside it.

Table extraction from PDFs is a best effort process based on text position, since PDFs do not store table structure explicitly the way a spreadsheet does. If columns merge together, raise the column sensitivity slider, if a single column splits into two, lower it. Complex nested tables or unusual layouts may need manual cleanup afterward.

Not directly. A scanned PDF is just an image with no underlying text layer, so there is nothing for this tool to read positions from. Run the page through an OCR tool first to add a text layer or extract the text, then convert that text based output.

Yes, when your sheet layout is set to combined, a second “Also Download CSV” button appears next to the Excel download after conversion. The CSV option is not available in one sheet per page mode, since a CSV file can only represent a single flat table.

No. Both the PDF reading, pdf.js, and the spreadsheet writing, SheetJS, run entirely in your browser. Your document is never transmitted anywhere.

Yes. If the PDF needs a password to open, a password field appears automatically after you upload it. Enter the password and click Unlock, then continue as normal. The password is used locally to open the file and is never sent anywhere.

Privacy Overview

Cookies let this site remember your preferences and show us which tools people actually use. Full detail sits in our Privacy Policy.