pdftract/examples/debug_content_hash.rs
jedarden 246befd8d1 feat(pdftract-2m3gl): implement PHP SDK with Packagist publishing
- Add jedarden/pdftract Composer package (sdk/php/)
- Implement Client.php with proc_open subprocess execution
- Add PSR-3 LoggerInterface integration (defaults to NullLogger)
- Add 9 contract methods: extract, extractText, extractMarkdown, extractStream, search, getMetadata, hash, classify, verifyReceipt
- Add readonly model classes: Document, Page, Metadata, Fingerprint, Classification, Match, Receipt
- Add exception classes: PdftractException base + 8 subclasses
- Add PHPUnit conformance test suite
- Add phpunit.xml configuration
- Add composer.json with jedarden/pdftract package name
- Add .ci/argo-workflows/pdftract-php-publish.yaml (Packagist auto-discovery from git tags)

Also includes Ruby SDK scaffold from parallel workflow.

Closes pdftract-2m3gl
2026-06-01 10:27:03 -04:00

46 lines
1.9 KiB
Rust

use pdftract_core::document::parse_pdf_file;
use std::path::Path;
fn main() {
let paths = [
"tests/fingerprint/fixtures/content_edit_one_glyph/v1.pdf",
"tests/fingerprint/fixtures/content_edit_one_glyph/v2.pdf",
];
for path in paths {
println!("\n=== {} ===", path);
let (fp, catalog, pages, resolver) = parse_pdf_file(Path::new(path))
.expect("Failed to parse");
println!("Fingerprint: {}", fp);
println!("Page count: {}", pages.len());
if let Some(page) = pages.first() {
println!("Contents refs: {:?}", page.contents);
println!("MediaBox: {:?}", page.media_box);
println!("Rotate: {:?}", page.rotate);
}
// Try to resolve the first content stream
if let Some(page) = pages.first() {
if let Some(&content_ref) = page.contents.first() {
println!("Resolving content ref: {:?}", content_ref);
match resolver.resolve(content_ref) {
Ok(obj) => {
println!("Resolved object type: {:?}", std::mem::discriminant(&obj));
if let Some(stream) = obj.as_stream() {
println!("Stream dict keys: {:?}", stream.dict.keys().collect::<Vec<_>>());
if let Some(&len) = stream.dict.get("/Length").and_then(|l| l.as_integer()) {
println!("Stream Length: {}", len);
}
if let Some(&filter) = stream.dict.get("/Filter").and_then(|f| f.as_name()) {
println!("Stream Filter: {}", filter);
}
}
}
Err(e) => println!("Failed to resolve: {:?}", e),
}
}
}
}
}