Changelog
Every release, newest first. This page is generated from the repository's CHANGELOG.md, so it always matches the code.
-
Fixed
- Cropping rotated PDF pages now trims the edge shown in the preview instead of mirroring the crop on pages rotated 90 or 270 degrees.
-
Added
- Batch PDF OCR is available in both the CLI and desktop app. The new
lexo ocr-batchcommand accepts PDF files or folders and exports one UTF-8 TXT file per source; existing outputs are skipped for resumable runs and can be replaced with--overwrite. - The desktop batch workflow supports multi-file or folder selection, output and OCR options, progress, cancellation, Google sign-in recovery, and the
Ctrl+Alt+Oshortcut.
- Batch PDF OCR is available in both the CLI and desktop app. The new
-
Fixed
- Splitting a spread PDF whose pages carry a rotation flag no longer drops the far half as a blank page, and re-splitting an already-split PDF no longer produces duplicate halves or loses content. Each half is now taken from the displayed page and anchored to the current cropbox.
-
Added
- The page preview can be zoomed and panned.
- Scrolling over the page preview moves between pages.
- Run page ranges accept
all,odd, andevenkeywords, with quick-select buttons for each.
Fixed
- Cropping a PDF page a second time no longer drifts. The new crop is now anchored to the current cropbox, so it insets within the already-cropped region instead of shifting back toward the original page origin.
- The crop box stays visible when switching between page previews.
-
Fixed
- PDFs whose text layer is legacy non-Unicode "glyph soup" (e.g. some older Burmese printing fonts encode their text as Private Use Area glyph ids) no longer come back blank. Such a layer is detected as unusable and the page is OCR'd instead of returning meaningless characters.
- An expired or revoked Google sign-in is now surfaced clearly. The token is validated once before a run, so it fails with a single "sign in again" message instead of every page failing with a cryptic error;
is_authenticatedno longer reports an unusable token as signed in.
Added
- When OCR needs Google sign-in, the desktop app now offers to sign in in place and retries the run on success.
-
Added
- Per-page OCR results now appear in the GUI as each page finishes, instead of only after the whole run completes.
- Page edits (delete, rotate, crop, split, append, reorder) run in the background with a busy indicator, so the window stays responsive on large documents. Run/OCR, Save, and page operations are disabled while an edit runs.
Fixed
- OCR no longer crashes the app on large multi-page runs. A single Google Drive HTTP client was shared across the engine's concurrent workers; since httplib2 is not thread-safe this corrupted its state and faulted the process (Windows heap corruption). Each worker now gets its own client.
- OCR returned empty text (or failed to upload with HTTP 413) for PDFs with very large pages. Pages now render as resolution-capped JPEGs that stay within Google Drive's upload and OCR limits.
lexo infoand--versionnow report the actual package version (the reported value had drifted from the published version).
Changed
- Hash a PDF once per OCR run instead of once per render batch (much faster on large files).
- Skip rebuilding the whole thumbnail strip when an OCR run finishes; per-page status badges already update live.
-
Changed
- Use SPDX license expression for verified PyPI metadata.
- Expand PyPI classifiers: add environment, intended audience, and per-version Python tags.
- Add Changelog and Releases links to project URLs.
- Fix README logo URL to absolute path so it renders on PyPI.
-
First public release. Lexo is a complete, from-scratch rebuild of the previous OCR Text Extractor into a local-first desktop document OCR tool. The legacy Tkinter/CustomTkinter application has been removed.
Added
- Document-centric engine with a hexagonal design: a UI-agnostic core behind swappable ports, driven identically by the CLI and the GUI.
- PDF operations: extract page ranges, split, crop, rotate, merge, and split two-up spreads.
- Smart OCR routing: digital PDF pages use their embedded text layer; only scanned pages are OCR'd (
--force-ocroverrides). - OCR via Google Docs OCR (free, best Burmese accuracy), behind a pluggable provider port so other engines can slot in.
- Burmese-aware text handling: NFC normalization and zero-width-space-safe cleaning.
- Exports: plain text (default), Markdown (with YAML frontmatter), and JSONL.
- A PySide6 desktop GUI (
lexo gui): a top toolbar driving the open -> organize -> run -> proofread -> export flow, a left pages strip with per-page status and reordering, and a page preview beside an editable text pane. A visual crop/split editor for PDFs and images, copy-to-clipboard, and toast confirmations. - Typer CLI:
info,check-update,extract,ocr,pdfoperations,login,logout, andgui. - Bundled Noto Sans Myanmar font (SIL OFL) for consistent Burmese rendering.
Changed
- Project renamed from
ocr-text-extractortolexo; installed withuv tool install lexo. - OAuth scope narrowed to
drive.file; tokens are stored in the OS keychain, replacing the previous pickle-based token storage.
Removed
- The legacy v1 modules: the Tkinter GUI, the ad-hoc OCR processor, and pickle token storage.