You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+16Lines changed: 16 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,6 +2,22 @@
2
2
3
3
All notable changes to PDFOxide are documented here.
4
4
5
+
## [0.3.17] - 2026-03-08
6
+
> Stable Recursion and Refined Table Heuristics
7
+
8
+
### Features
9
+
10
+
-**Refined Table Detection** — The spatial table detector now requires at least **2 columns** to identify a region as a table. This significantly reduces false positives where single-column lists or bullet points were incorrectly wrapped in ASCII boxes.
11
+
-**Optimized Text Extraction** — Refactored the internal extraction pipeline to eliminate redundant work when processing Tagged PDFs. The structure tree and page spans are now extracted once and shared across the detection and rendering phases.
12
+
13
+
### Bug Fixes
14
+
15
+
-**Resolved `RefCell` already borrowed panic** (#237) — Fixed a critical reentrancy issue where recursive Form XObject processing (e.g., extracting images from nested forms) could trigger a runtime panic. Replaced long-lived borrows with scoped, tiered cache access using Rust best practices. (Reported by **@marph91**)
16
+
17
+
### 🏆 Community Contributors
18
+
19
+
🥇 **@marph91** — Thank you for identifying the complex `RefCell` borrow conflict in nested image extraction (#237). This report led to a comprehensive safety audit of our interior mutability patterns and a more robust, recursion-safe caching architecture! 🚀
20
+
5
21
## [0.3.16] - 2026-03-08
6
22
> Advanced Visual Table Detection and Automated Python Stubs
Copy file name to clipboardExpand all lines: pdf_oxide_cli/Cargo.toml
+2-2Lines changed: 2 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
[package]
2
2
name = "pdf_oxide_cli"
3
-
version = "0.3.16"
3
+
version = "0.3.17"
4
4
edition = "2021"
5
5
description = "CLI for pdf-oxide — the fastest PDF toolkit. 22 commands: text extraction, PDF to markdown, search, merge, split, images, compress, encrypt, watermark, forms, and more."
6
6
license = "MIT OR Apache-2.0"
@@ -16,7 +16,7 @@ name = "pdf-oxide"
16
16
path = "src/main.rs"
17
17
18
18
[dependencies]
19
-
pdf_oxide = { version = "0.3.16", path = "..", features = ["rendering", "logging"] }
19
+
pdf_oxide = { version = "0.3.17", path = "..", features = ["rendering", "logging"] }
Copy file name to clipboardExpand all lines: pdf_oxide_mcp/Cargo.toml
+2-2Lines changed: 2 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
[package]
2
2
name = "pdf_oxide_mcp"
3
-
version = "0.3.16"
3
+
version = "0.3.17"
4
4
edition = "2021"
5
5
description = "MCP server for PDF extraction — gives Claude, Cursor, and AI assistants the ability to read PDFs locally. Text, markdown, and HTML output. Powered by pdf_oxide."
6
6
license = "MIT OR Apache-2.0"
@@ -16,7 +16,7 @@ name = "pdf-oxide-mcp"
16
16
path = "src/main.rs"
17
17
18
18
[dependencies]
19
-
pdf_oxide = { version = "0.3.16", path = ".." }
19
+
pdf_oxide = { version = "0.3.17", path = ".." }
20
20
serde = { version = "1.0", features = ["derive"] }
Copy file name to clipboardExpand all lines: pyproject.toml
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
5
5
[project]
6
6
name = "pdf_oxide"
7
-
version = "0.3.16"
7
+
version = "0.3.17"
8
8
description = "The fastest Python PDF library: 0.8ms mean, 5× faster than PyMuPDF. Text extraction, markdown conversion, PDF creation. 100% pass rate on 3,830 PDFs."
0 commit comments