PDF to Excel
Operator-list parsing · Border detection · Merged cells · Font styles · Form fields
Drop your PDF here
or browse file
Every path op, colour change (RGB/CMYK/gray) and CTM matrix transform is traced — no rasterization needed.
H and V line segments are extracted, tolerance-clustered into a grid, and intersected to find cell bounding boxes precisely.
Each expected interior border segment is checked for existence. Missing ones produce XLSX !merges entries automatically.
Filled rectangles whose bounds match a cell are mapped to Excel cell fills, preserving colour coding from the original PDF.
For borderless tables, items are row-clustered by Y-tolerance then column-histogramed by X — robust to ragged alignments.
Every cell is tested for boolean, date (8 patterns), percentage, currency (₹$€£¥…), number with format, or plain string.
AcroForm widgets (Tx, Btn, Ch) are read from page annotations and exported to a dedicated Form Fields sheet with labels.
Real Table Structure
Text positions are clustered into rows and columns — you get editable cells, not one giant image.
100% Private
Parsing runs in your browser. Your PDF never leaves your device.
Auto Type Inference
Numbers, percentages and integers are converted to real Excel number cells with formats.
Frequently Asked Questions
Does it work on scanned PDFs?
No — scanned PDFs are images with no text layer. This tool works on digital PDFs. For scans, run our OCR tool first.
How are merged cells detected?
We build the grid from horizontal and vertical border segments, then for each cell we check whether the expected interior borders actually exist. Missing borders produce native XLSX merges.
Which currencies are recognised?
₹ ₽ ¥ ₩ ₪ $ € £ — cells matching these are exported as real currency-formatted numbers with the correct symbol.
What about form fields?
AcroForm widgets — text fields (Tx), buttons (Btn) and choice fields (Ch) — are extracted from the page annotations into a dedicated Form Fields worksheet.
Is my PDF uploaded anywhere?
Never. All parsing runs in JavaScript inside your browser.
