New Features
-
CLI with 22 subcommands and interactive REPL (#176) — standalone
pdf-oxidebinary 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) andirm oxide.fyi/install.ps1 | iex(Windows). -
MCP server for AI assistants (#177) —
pdf-oxide-mcpbinary implementing Model Context Protocol (JSON-RPC 2.0 over stdio) withextracttool 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) andpdf-oxide-mcp(MCP server). -
Table detection pipeline (#178) — wired structure-tree and spatial table detectors into
to_markdown(),to_html(), and converters via newextract_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_cachefor 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 usesafe_float_cmp()with proper NaN handling. Verified on 220 PDFs across 6 test datasets (42 previously panicking PDFs now pass). -
Compressed xref validation —
validate_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-oxideandpdf-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_oxidePython (PyPI)
pip install pdf_oxideJavaScript/WASM (npm)
npm install pdf-oxide-wasmCLI (Homebrew)
brew install yfedoseev/tap/pdf-oxideCLI (Scoop — Windows)
scoop bucket add pdf-oxide https://github.com/yfedoseev/scoop-pdf-oxide
scoop install pdf-oxideCLI (Shell installer)
curl -fsSL https://raw.githubusercontent.com/yfedoseev/pdf_oxide/main/install.sh | shCLI (cargo-binstall)
cargo binstall pdf_oxide_cliMCP Server (for AI assistants)
cargo install pdf_oxide_mcpPre-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.