LEXO

LEXO 08 Changelog

v0.4.1 AGPL-3.0

Changelog

Every release, newest first. This page is generated from the repository's CHANGELOG.md, so it always matches the code.

  1. 0.4.1

    Latest

    Release on GitHub

    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.
  2. Added

    • Batch PDF OCR is available in both the CLI and desktop app. The new lexo ocr-batch command 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+O shortcut.
  3. 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.
  4. Added

    • The page preview can be zoomed and panned.
    • Scrolling over the page preview moves between pages.
    • Run page ranges accept all, odd, and even keywords, 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.
  5. 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_authenticated no 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.
  6. 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 info and --version now 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.
  7. 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.
  8. 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-ocr overrides).
    • 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, pdf operations, login, logout, and gui.
    • Bundled Noto Sans Myanmar font (SIL OFL) for consistent Burmese rendering.

    Changed

    • Project renamed from ocr-text-extractor to lexo; installed with uv 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.
CHANGELOG.md on GitHub