pdftract/crates/pdftract-cli/Cargo.toml
jedarden f85e5149dd feat(pdftract-91e1i): HTTP fetch sequence implementation
Implement orchestration layer connecting HttpRangeSource to Phase 1.3
xref resolver and Phase 1.4 document model for remote PDF access:

- Document::open_remote() public API for remote PDF loading
- Progressive tail fetch (16 KB → 1 MB) for startxref location
- Xref forward-scan disabled for remote sources (via is_remote check)
- Page-by-page on-demand fetch via HttpRangeSource caching
- Resource lazy load through XrefResolver cache
- HEAD probe with 405 fallback, no Content-Length handling

Acceptance criteria:
 open_remote(url) returns Document with correct page count
 HEAD failure modes (405, no Content-Length, 401) handled
 xref forward-scan disabled for remote (is_remote check)
 Page-by-page on-demand fetch (HttpRangeSource LRU cache)
 INV-8 maintained (all errors return Result)

Files modified:
- crates/pdftract-core/src/document.rs (Document::open_remote, from_source)
- crates/pdftract-core/src/remote.rs (progressive tail fetch)
- crates/pdftract-core/src/lib.rs (re-exports)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 13:17:00 -04:00

158 lines
4.1 KiB
TOML

[package]
name = "pdftract-cli"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
repository.workspace = true
publish = true
default-run = "pdftract"
[build-dependencies]
libflate = "2"
[[bin]]
name = "pdftract"
path = "src/main.rs"
test = true
[[bin]]
name = "generate_lzw_fixtures"
path = "../../tests/fixtures/generate_lzw_fixtures_main.rs"
[[bin]]
name = "generate_preprocess_fixtures"
path = "../../tests/fixtures/preprocess/generate_fixtures_main.rs"
[[bin]]
name = "gen_lexer_golden"
path = "../../tests/gen_lexer_golden.rs"
[[bin]]
name = "build-xref-fixture"
path = "../../tools/build-xref-fixture/main.rs"
[[bin]]
name = "generate_slide_deck_fixtures"
path = "../../tests/fixtures/generate_slide_deck_fixtures.rs"
[[bin]]
name = "generate_scientific_paper_fixtures"
path = "../../tests/fixtures/generate_scientific_paper_fixtures.rs"
[[bin]]
name = "generate_book_chapter_fixtures"
path = "../../tests/fixtures/generate_book_chapter_fixtures.rs"
[[bin]]
name = "generate_fixtures"
path = "../../tests/document_model/fixtures/generate_fixtures.rs"
[[bin]]
name = "generate_expected_json"
path = "../../tests/document_model/generate_expected_json.rs"
[[bench]]
name = "grep_1000"
harness = false
[lib]
name = "pdftract_cli"
path = "src/lib.rs"
[dependencies]
aho-corasick = "1"
anyhow = { workspace = true }
atty = "0.2"
terminal_size = "0.3"
async-stream = "0.3"
axum = { version = "0.7", features = ["json", "multipart"] }
base64 = { workspace = true }
bytes = "1"
chrono = { version = "0.4", features = ["serde"] }
clap = { version = "4.5", features = ["derive"] }
crossbeam-channel = "0.5"
dirs = "5.0"
hyper = { version = "1.0", features = ["full"] }
hyper-util = { version = "0.1", features = ["full"] }
image = "0.24"
http-body-util = "0.1"
humantime = "2.1"
indicatif = { version = "0.17", optional = true }
num_cpus = "1"
rayon = "1"
libloading = { version = "0.8", optional = true }
lzw = { workspace = true }
multer = "3"
pdftract-core = { path = "../pdftract-core" }
regex = "1.10"
secrecy = { workspace = true }
semver = "1.0"
serde = { workspace = true, features = ["derive"] }
serde_json = "1.0"
serde_yaml = { version = "0.9", optional = true }
sha2 = "0.10"
termcolor = "1.4"
schemars = { version = "0.8", features = ["derive"] }
subtle = "2.6"
tempfile = "3"
tera = "1"
tokio = { version = "1", features = ["full"] }
tokio-stream = "0.1"
tower = { version = "0.5", features = ["full"] }
tower-http = { version = "0.5", features = ["cors", "trace", "limit", "compression-full"] }
tracing = { workspace = true }
ureq = { version = "2.9", optional = true }
uuid = { version = "1.0", features = ["v4", "serde"] }
walkdir = "2"
chromiumoxide = { version = "0.6", optional = true }
[target.'cfg(unix)'.dependencies]
libc = "0.2"
[features]
default = []
# OCR support via Tesseract
ocr = ["pdftract-core/ocr"]
# Full rendering via PDFium (JBIG2, JPEG2000, CCITT decoding)
full-render = ["dep:libloading", "pdftract-core/full-render"]
# Remote HTTP source support
remote = ["dep:ureq"]
# Document profiles
profiles = ["dep:serde_yaml", "pdftract-core/profiles"]
# HTTP serve mode
serve = []
# MCP server mode
mcp = []
# Inspector web viewer
inspect = []
# Folder grep mode
grep = ["dep:indicatif"]
# Content-addressed cache
cache = []
# Visual citation receipts
receipts = []
# Markdown output
markdown = []
# Headless browser testing for security tests (requires Chrome/Chromium)
chrome-test = ["chromiumoxide"]
[package.metadata.binstall]
pkg-url = "{ repo }/releases/download/v{ version }/pdftract-v{ version }-{ target }.{ archive-format }"
pkg-fmt = "tgz"
bin-dir = "pdftract-v{ version }-{ target }/{ bin }{ binary-ext }"
[package.metadata.binstall.overrides.x86_64-pc-windows-gnu]
pkg-fmt = "zip"
[dev-dependencies]
ureq = { version = "2.9", features = ["socks-proxy"] }
serde_yaml = "0.9"
jsonschema = "0.18"
reqwest = { version = "0.12", features = ["blocking", "json", "rustls-tls", "multipart"], default-features = false }
schemars = { version = "0.8", features = ["derive"] }
image = "0.24"
chrono = { version = "0.4", features = ["serde"] }
criterion = "0.5"
chromiumoxide = "0.6"
lopdf = "0.34"