Five banks, not “every Indian PDF”
Statement-to-Excel farms want the document that has your salary credits. This page pulls the text layer with pdf.js, guesses HDFC / SBI / ICICI / Axis / Kotak from the header, and matches day-first dates plus Indian grouping. If the layout is a new template, you get an honest miss and a raw-text dump — not 400 hallucinated rows.
Worked example: HDFC savings, password DOB
Drop the PDF. Enter the password. Parse. You want a table with dates like 01/04/2026 and amounts without a second comma in the rupee. Download XLSX. Open row 1 and the last row next to the PDF. If a UPI narration ate the next line’s date, the generic matcher slipped — copy the raw text.
Worked example: SBI 01-Apr-24
SBI likes dd-MMM-yy. The parser maps that. “TO TRANSFER” plus a Dr amount should land in Debit, not Credit. If both columns fill, the line had two numbers and no Dr/Cr tag; fix it by hand.
Worked example: e-stamped scan from a branch
If you can highlight text in Acrobat, this can work. If it is a photograph of a passbook, stop. Use the bank’s own CSV export or type. I will not pretend tesseract on a folded passbook is a ledger.
Questions
Is the statement uploaded?
No. pdf.js reads it here. SheetJS builds the spreadsheet here. Libraries still load from file hosts.
Which banks?
HDFC, SBI, ICICI, Axis, Kotak — text-layer PDFs with Indian dates and 1,23,456.78 grouping. Other banks may hit the generic matcher or fail.
Password PDF?
Type the user password on this page. You do not have to flatten via unlock first (and should not, if you want selectable text).
Scanned statement?
No text layer, no rows. This is not OCR. Photograph-as-PDF will dump raw emptiness and say so.
Dr/Cr vs withdrawal columns?
The parser tries both. Spot-check the first and last line against the PDF before you file ITR or a visa pack.
Will it match the bank’s own Excel?
No. Narration wrapping and multi-line descriptions are the failure mode. Export CSV and eyeball.