v1.4.0
Immutable
release. Only release title and notes can be modified.
Added
- Full right-to-left extraction support: page direction is auto-detected, RTL tables are emitted with column 1 as the rightmost (first logical) column, and mixed Hebrew/English cells are joined in reading order
- Excel exports of RTL documents open with a right-to-left sheet view, and the data preview lays out right-to-left for RTL documents
- "Include Headers" now adds an Excel autofilter to the header row, making the exported sheet filterable
- Fully bilingual status messages: progress, errors, file info, page count, and column labels now follow the selected language
- Footer now shows the GitHub logo linking to the source repository and an Apache License 2.0 notice (bilingual)
- Release workflow (
.github/workflows/release.yml): pushing av*tag (or a manual dispatch) creates the GitHub Release with the matching CHANGELOG section as notes
Changed
- Table extraction rewritten around page-wide column detection (coverage histogram): rows with empty cells keep their remaining cells in the correct columns instead of shifting left, and title or total lines can no longer break column detection
- Row grouping now merges nearby baselines instead of fixed-grid rounding, so slightly wobbly lines are no longer split into separate rows
- Column boundaries use the real rendered item widths from PDF.js (clamped against producer-inflated widths) instead of a character-count estimate
- Overlaid fragments such as decimal points are folded back into their host number ("1 20" plus an overlaid "." now extracts as "1.20")
- Structured data extraction keeps key names: "Name: John" extracts as two cells ("Name", "John") instead of dropping the key
- Cleanup options (Skip Empty Rows, Merge Fragments, Auto-detect Columns) are now non-destructive: unchecking an option restores the original extracted data
- Turnstile verification is required once per session instead of once per file
- "Hebrew/Arabic RTL Support" is now enabled by default (it only activates on documents detected as RTL)
scripts/release.shreworked for the PR-based flow: it now only validates and pushes the version tag (the version bump and CHANGELOG entry come from the PR, the GitHub Release comes from the release workflow)
Fixed
- Excel exports no longer prefix cells that start with "=", "+", "-", or "@" with an apostrophe; SheetJS writes string-typed cells that spreadsheet applications never evaluate as formulas, so the CSV-only injection guard now leaves .xlsx cell text unmangled
- CSV export now quotes cells containing carriage returns
- Uploaded filenames only have the final ".pdf" extension stripped (case-insensitive), so names containing ".pdf" elsewhere are no longer mangled
- Removed the misleading "multiple" attribute from the file input (only one file is processed)
- Dropped files with an empty MIME type (some Linux file managers) are accepted when they have a .pdf extension
- The previous PDF document is now destroyed before loading a new one, releasing its memory
- The service worker precaches style.css, app.js, manifest.json, and the icons, so the app works offline instead of loading unstyled
- Replaced spread-based Math.max calls with reduce loops to avoid stack overflows on very large documents