v0.3.69 | Language-bindings release — idiomatic bindings for **C++, Swift, Kotlin, Dart, R, Julia, Zig, Scala, Clojure, Objective-C, and Elixir**, each over the stable C ABI, with per-language CI, package-registry publishing, cross-language regression examples, and single-source version management.
Added
- Eleven new language bindings, each with an idiomatic wrapper, an api-coverage test (one assertion per public method), runnable CI-asserted examples, a README with install coordinates, and a dedicated CI workflow (Linux+macOS) running the same verification set:
- C++ (
cpp/) — header-only C++17 RAII wrapper; CMake withinstall/exporttargets and a Conan recipe. - Swift (
swift/) — SwiftPM package + C module map. - Kotlin (
kotlin/) — thin facade over the Java JNI binding. - Dart/Flutter (
dart/) —dart:ffi. - R (
r/) —.CallC shim, external-pointer handles. - Julia (
julia/) —ccall. - Zig (
zig/) —@cImport. - Scala (
scala/) — thin facade over the Java JNI binding (Scala 3). - Clojure (
clojure/) — direct Java interop over the JNI binding. - Objective-C (
objc/) — NSObject wrappers over the C ABI. - Elixir (
elixir/) — dirty-scheduler NIF (CPU-bound work never blocks the BEAM).
- C++ (
- Package-registry publishing wired into the release pipeline for the new bindings: Maven Central (Kotlin, Scala), Clojars (Clojure), Hex.pm (Elixir), and pub.dev (Dart, via GitHub OIDC). Objective-C ships as a Trunk-free CocoaPods binary pod — an
xcframework+ podspec uploaded as release assets and installed via a:podspecURL — since CocoaPods Trunk goes read-only on 2026-12-02. C++ (vcpkg/Conan), R (CRAN), Julia (General registry), and Swift/Zig (git tag) are documented indocs/RELEASING-bindings.md. - Cross-language regression examples — alongside each binding's basic example, three shared-scenario examples (HTML extraction, word geometry, table extraction) run with output assertions in every binding's CI workflow.
- Single-source version management —
scripts/sync_version.pypropagates the canonicalCargo.tomlversion into every binding manifest and version/parity assert (--checkverifies,--set X.Y.Zbumps everything). AVersion ConsistencyCI workflow fails if any binding drifts.
Fixed
- Non-Identity-ordered Type0 fonts no longer emit a wrong character for CIDs missing from
/ToUnicode(#773, #775) — for an embedded Type0 font whose/ToUnicodeCMap omits some drawn CIDs (e.g. a ligature glyph with no single Unicode codepoint), the decode path fell back to a numeric guess — the GID via the standard glyph-name table → AGL, or the CID itself as a code point (char::from_u32) — emitting a plausible-but-wrong, content-like character that varied per subset (e.g. atiligature →:/D, sonotificacao→no:ficacao). The glyph has no Unicode anywhere in the file (no/ToUnicodeentry, nopostname, no GSUB), so the letters are unrecoverable, but substituting a wrong character is silent corruption. When a usable/ToUnicodeis present, the GID→AGL guess is now suppressed for all Type0 fonts, and the CID-as-Unicode guess is suppressed for fonts whoseCIDSystemInfoordering is notIdentity, so an uncovered CID there decodes toU+FFFDinstead. For Identity-ordered (Adobe-Identity-0) fonts the CID-as-Unicode guess is restricted to whitespace (U+0020→ space, which producers routinely omit and is reliably CID == codepoint); any other uncovered CID likewise decodes toU+FFFD. A font with no/ToUnicodestill uses the CID-as-Unicode heuristic exactly as before, and the authoritative embedded-cmap/postlookups are unchanged. This also resolves the opt-in-flag request (#775) by making the detectable-gap behaviour the default rather than a configuration flag. Thanks @schelip for reporting both issues and contributing the fix.
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.