Skip to main content

read_pptx/
read_pptx.rs

1//! Example demonstrating reading and inspecting PPTX files
2
3use ppt_rs::opc::package::Package;
4use std::fs;
5
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7    // First, create a sample PPTX file to read
8    use ppt_rs::generator::{create_pptx_with_content, SlideContent};
9
10    let slides = vec![
11        SlideContent::new("Sample Presentation")
12            .add_bullet("This is a sample slide")
13            .add_bullet("Created for reading demonstration"),
14        SlideContent::new("Second Slide")
15            .add_bullet("More content here")
16            .add_bullet("Ready to be read"),
17    ];
18
19    let pptx_data = create_pptx_with_content("Sample", slides)?;
20    fs::write("sample_to_read.pptx", pptx_data)?;
21
22    // Now read the PPTX file
23    println!("Reading PPTX file: sample_to_read.pptx\n");
24
25    let package = Package::open("sample_to_read.pptx")?;
26
27    println!("Package Information:");
28    println!("  Total parts: {}", package.part_count());
29    println!("\nPackage Contents:");
30
31    let paths = package.part_paths();
32    for path in &paths {
33        if let Some(content) = package.get_part(path) {
34            println!("  {} ({} bytes)", path, content.len());
35        }
36    }
37
38    // Display key parts
39    println!("\n--- Key Parts Analysis ---");
40
41    // Check for presentation.xml
42    if let Some(pres_content) = package.get_part("ppt/presentation.xml") {
43        println!("\n✓ presentation.xml found ({} bytes)", pres_content.len());
44        if let Ok(content_str) = std::str::from_utf8(pres_content) {
45            if content_str.contains("<p:sldIdLst>") {
46                println!("  - Contains slide list");
47            }
48        }
49    }
50
51    // Check for slides
52    let mut slide_count = 0;
53    for path in &paths {
54        if path.starts_with("ppt/slides/slide") && path.ends_with(".xml") {
55            slide_count += 1;
56            if let Some(content) = package.get_part(path) {
57                println!("\n✓ {} found ({} bytes)", path, content.len());
58            }
59        }
60    }
61    println!("\nTotal slides: {}", slide_count);
62
63    // Check for core properties
64    if let Some(core_content) = package.get_part("docProps/core.xml") {
65        println!("\n✓ docProps/core.xml found ({} bytes)", core_content.len());
66        if let Ok(content_str) = std::str::from_utf8(core_content) {
67            if content_str.contains("<dc:title>") {
68                println!("  - Contains title metadata");
69            }
70        }
71    }
72
73    // Check for relationships
74    if let Some(rels_content) = package.get_part("_rels/.rels") {
75        println!("\n✓ _rels/.rels found ({} bytes)", rels_content.len());
76        if let Ok(content_str) = std::str::from_utf8(rels_content) {
77            let rel_count = content_str.matches("<Relationship").count();
78            println!("  - Contains {} relationships", rel_count);
79        }
80    }
81
82    // Check for content types
83    if let Some(ct_content) = package.get_part("[Content_Types].xml") {
84        println!("\n✓ [Content_Types].xml found ({} bytes)", ct_content.len());
85        if let Ok(content_str) = std::str::from_utf8(ct_content) {
86            let override_count = content_str.matches("<Override").count();
87            let default_count = content_str.matches("<Default").count();
88            println!("  - Contains {} Override entries", override_count);
89            println!("  - Contains {} Default entries", default_count);
90        }
91    }
92
93    // Summary
94    println!("\n--- Summary ---");
95    println!("Successfully read PPTX package with {} parts", package.part_count());
96    println!("Package structure is valid and can be modified");
97
98    Ok(())
99}