use lopdf::{Document, Object, ObjectStream, dictionary};
#[cfg(feature = "async")]
use tokio::runtime::Builder;
#[cfg(not(feature = "async"))]
fn load_document(path: &str) -> Document {
Document::load(path).unwrap()
}
#[cfg(feature = "async")]
fn load_document(path: &str) -> Document {
Builder::new_current_thread()
.enable_all()
.build()
.unwrap()
.block_on(async move {
Document::load(path).await.unwrap()
})
}
fn main() {
println!("Testing direct object stream creation and saving...\n");
let mut doc = Document::with_version("1.5");
let mut obj_stream = ObjectStream::builder()
.max_objects(10)
.compression_level(6)
.build();
obj_stream.add_object((1, 0), Object::Integer(42)).unwrap();
obj_stream.add_object((2, 0), Object::String(b"Test".to_vec(), lopdf::StringFormat::Literal)).unwrap();
println!("Object stream has {} objects", obj_stream.object_count());
let stream_obj = obj_stream.to_stream_object().unwrap();
println!("Stream dict: {:?}", stream_obj.dict);
println!("Stream has Filter: {}", stream_obj.dict.get(b"Filter").is_ok());
let stream_id = doc.add_object(stream_obj);
println!("Added object stream as {} 0 R", stream_id.0);
let pages_id = doc.add_object(dictionary! {
"Type" => "Pages",
"Kids" => vec![],
"Count" => 0
});
let catalog_id = doc.add_object(dictionary! {
"Type" => "Catalog",
"Pages" => pages_id
});
doc.trailer.set("Root", catalog_id);
println!("\nSaving document...");
doc.save("test_direct_objstream.pdf").unwrap();
println!("Saved to test_direct_objstream.pdf");
println!("\nLoading back...");
let loaded = load_document("test_direct_objstream.pdf");
for (id, obj) in &loaded.objects {
if let Object::Stream(stream) = obj {
if let Ok(type_obj) = stream.dict.get(b"Type") {
if let Ok(type_name) = type_obj.as_name() {
if type_name == b"ObjStm" {
println!("Found object stream {} 0 R", id.0);
println!(" Dict: {:?}", stream.dict);
println!(" Has Filter: {}", stream.dict.get(b"Filter").is_ok());
if let Ok(filter) = stream.dict.get(b"Filter") {
println!(" Filter value: {:?}", filter);
}
}
}
}
}
}
}