Skip to content

v0.3.11 | CLI, MCP Server, Multi-Platform Distribution, Performance

Choose a tag to compare

@github-actions github-actions released this 01 Mar 09:22

New Features

  • CLI with 22 subcommands and interactive REPL (#176) — standalone pdf-oxide binary with text/markdown/html extraction, merge, split, compress, encrypt/decrypt, search, images, rotate, crop, watermark, forms, bookmarks, and more. Interactive REPL with session persistence and autocomplete. OS-specific install scripts: curl -fsSL oxide.fyi/install.sh | sh (Linux/macOS) and irm oxide.fyi/install.ps1 | iex (Windows).

  • MCP server for AI assistants (#177) — pdf-oxide-mcp binary implementing Model Context Protocol (JSON-RPC 2.0 over stdio) with extract tool for text/markdown/HTML output, page selection, and image extraction. Zero-install via crgx: just add {"command": "crgx", "args": ["pdf_oxide_mcp@latest"]} to Claude Desktop, Claude Code, or Cursor config.

  • Multi-platform distribution — pre-built binaries for 6 targets (Linux x86_64 glibc/musl, Linux ARM64, macOS Intel/Apple Silicon, Windows). Homebrew tap, Scoop bucket, .deb packages, cargo-binstall, and shell installers. Release archives now include both pdf-oxide (CLI) and pdf-oxide-mcp (MCP server).

  • Table detection pipeline (#178) — wired structure-tree and spatial table detectors into to_markdown(), to_html(), and converters via new extract_page_tables() method. Markdown renders | col | tables, HTML renders <table> elements, plain text uses tab-delimited format.

Performance

  • Image extraction 270x speedup on pathological pages — pre-resolve XObject dictionary once per page (was per-Do operator), reuse xobject_stream_cache for Form XObject decompression, use fast image-only content stream parser for Form XObjects, cache Form XObject image results, avoid redundant stream cloning for ColorSpace resolution. Page 423 of "Understanding Deep Learning" (194 Do operators): 57s → 0.2s.

  • Markdown conversion 6x speedup — replaced O(n²) DBSCAN line clustering with O(n log n) sort-based approach, eliminated redundant extract_spans() call in markdown pipeline (was extracting text twice per page), removed per-heading full-page font scan.

  • Pre-decompression image filtering — skip decompressing image streams when dimensions exceed max_image_pixels (default 16MP). Avoids allocating and decompressing multi-gigabyte streams for oversized images.

  • Faster PNG encoding — skip tiny glyph-fragment images (<8x8 pixels) that are font rendering artifacts, not real images. Skip base64 embedding for oversized images (>4MP) in markdown output.

Bug Fixes

  • NaN float comparison panics — fixed 27 sort/comparison sites across 25 files that used partial_cmp().unwrap_or(Equal) on float values. NaN coordinates from malformed PDFs violated total ordering, causing Rust's sort to panic. All comparisons now use safe_float_cmp() with proper NaN handling. Verified on 220 PDFs across 6 test datasets (42 previously panicking PDFs now pass).

  • Compressed xref validationvalidate_object_at_offset() incorrectly treated compressed (type 2) xref entries' object stream numbers as byte offsets, triggering unnecessary full-file xref reconstruction (35+ seconds on large PDFs). Compressed entries are now recognized as valid without byte-level seeking.

  • Replaced broken inline table heuristic (required all rows to have same column count) with proper two-strategy detection: structure tree first, spatial fallback.

Release Pipeline

  • MCP server added to CI (build on Linux, macOS, Windows) and release workflow (build, archive, publish to crates.io).
  • Homebrew tap push automated in release workflow (was missing — only Scoop was being pushed).
  • Release archives cleaned up: only pdf-oxide + pdf-oxide-mcp (removed 8 legacy dev binaries).
  • Homebrew formula installs both pdf-oxide and pdf-oxide-mcp.

Community Contributors

Special thanks to @SeanPedersen for his continued dedication to PDF Oxide. Sean was one of the first to verify v0.3.10 after release and quickly identified critical issues including NaN sort panics on real-world PDFs and performance regressions in image extraction. His thorough testing across diverse PDF corpora has been invaluable — many of the performance fixes and bug fixes in this release trace directly back to issues he surfaced. Huge kudos for making PDF Oxide more robust for everyone.


Installation

Rust (crates.io)

cargo add pdf_oxide

Python (PyPI)

pip install pdf_oxide

JavaScript/WASM (npm)

npm install pdf-oxide-wasm

CLI (Homebrew)

brew install yfedoseev/tap/pdf-oxide

CLI (Scoop — Windows)

scoop bucket add pdf-oxide https://github.com/yfedoseev/scoop-pdf-oxide
scoop install pdf-oxide

CLI (Shell installer)

curl -fsSL https://raw.githubusercontent.com/yfedoseev/pdf_oxide/main/install.sh | sh

CLI (cargo-binstall)

cargo binstall pdf_oxide_cli

MCP Server (for AI assistants)

cargo install pdf_oxide_mcp

Pre-built Binaries
Download archives for Linux, macOS, and Windows from the assets below. Each archive includes both pdf-oxide (CLI) and pdf-oxide-mcp (MCP server).

Platform Support

Platform Architecture Archive
Linux x86_64 (glibc) pdf_oxide-linux-x86_64-*.tar.gz
Linux x86_64 (musl) pdf_oxide-linux-x86_64-musl-*.tar.gz
Linux ARM64 pdf_oxide-linux-aarch64-*.tar.gz
macOS x86_64 (Intel) pdf_oxide-macos-x86_64-*.tar.gz
macOS ARM64 (Apple Silicon) pdf_oxide-macos-aarch64-*.tar.gz
Windows x86_64 pdf_oxide-windows-x86_64-*.zip

Changelog

See CHANGELOG.md for full details.