omniparse

Crates.ioomniparse
lib.rsomniparse
version0.2.1
created_at2025-11-19 04:53:42.213854+00
updated_at2025-11-20 14:08:24.918591+00
descriptionA Rust toolkit for detecting and extracting metadata, text, and content from various file formats
homepage
repositoryhttps://github.com/sirhco/omniparse
max_upload_size
id1939423
size1,572,016
Chris Olson (sirhco)

documentation

README

Omniparse

A Rust toolkit for detecting and extracting metadata, text, and content from hundreds of different file formats. Omniparse provides both a command-line interface and a library API, serving as a Rust equivalent to Apache Tika.

Features

  • Automatic Type Detection: Identifies file types using magic bytes, content analysis, and extension fallback
  • Multiple Format Support: Extracts content from text, document, image, and archive formats
  • Rich Metadata Extraction: Retrieves format-specific metadata including title, author, dates, and more
  • Dual Interface: Use as a CLI tool or integrate as a library in your Rust applications
  • Pure Rust Implementation: Minimal dependencies, no external system libraries required
  • Async Support: Optional async API for non-blocking operations
  • Parallel Processing: Batch process multiple files in parallel for better performance
  • Streaming Support: Memory-efficient processing of large files

Supported Formats

Text Formats

  • Plain Text (TXT)
  • JSON
  • CSV/TSV
  • XML
  • HTML
  • CSS
  • RTF (Rich Text Format)

Document Formats

  • PDF
  • Microsoft Word (DOCX, DOC)
  • Microsoft Excel (XLSX, XLS)
  • Microsoft PowerPoint (PPTX, PPT)
  • OpenDocument Text (ODT)
  • OpenDocument Spreadsheet (ODS)
  • OpenDocument Presentation (ODP)

Image Formats

  • JPEG (with EXIF metadata)
  • PNG (with metadata chunks)
  • TIFF (with tags)

Archive Formats

  • ZIP
  • TAR

Installation

As a Library

Add Omniparse to your Cargo.toml:

[dependencies]
omniparse = "0.1"

For async support:

[dependencies]
omniparse = { version = "0.1", features = ["async"] }

For parallel processing:

[dependencies]
omniparse = { version = "0.1", features = ["parallel"] }

As a CLI Tool

Install using Cargo:

cargo install omniparse

Or build from source:

git clone https://github.com/omniparse/omniparse
cd omniparse
cargo build --release

The binary will be available at target/release/omniparse.

Library Usage

Basic Extraction

use omniparse::extract_from_path;

fn main() -> Result<(), omniparse::Error> {
    // Extract from a file
    let result = extract_from_path("document.pdf")?;
    
    println!("MIME type: {}", result.mime_type);
    println!("Confidence: {:.2}", result.detection_confidence);
    
    // Access content
    if let omniparse::Content::Text(text) = result.content {
        println!("Text content: {}", text);
    }
    
    // Access metadata
    if let Some(title) = result.metadata.title() {
        println!("Title: {}", title);
    }
    if let Some(author) = result.metadata.author() {
        println!("Author: {}", author);
    }
    
    Ok(())
}

Extract from Bytes

use omniparse::extract_from_bytes;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let data = std::fs::read("file.json")?;
    
    // With automatic type detection
    let result = extract_from_bytes(&data, None)?;
    
    // Or with a MIME type hint
    let result = extract_from_bytes(&data, Some("application/json"))?;
    
    println!("Detected: {}", result.mime_type);
    Ok(())
}

Async Extraction

use omniparse::extract_from_path_async;

#[tokio::main]
async fn main() -> Result<(), omniparse::Error> {
    let result = extract_from_path_async("document.pdf").await?;
    println!("Extracted: {}", result.mime_type);
    Ok(())
}

Check Supported Formats

use omniparse::{supported_mime_types, is_mime_supported};

fn main() {
    // Get all supported MIME types
    let types = supported_mime_types();
    println!("Supported formats: {}", types.len());
    
    // Check if a specific format is supported
    if is_mime_supported("application/pdf") {
        println!("PDF is supported!");
    }
}

Batch Processing

use omniparse::core::Extractor;
use omniparse::utils::parallel::process_files_parallel;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let extractor = Extractor::new();
    let files = vec!["file1.pdf", "file2.docx", "file3.txt"];
    
    // Process files in parallel
    let results = process_files_parallel(&extractor, &files);
    
    for file_result in results {
        match file_result.result {
            Ok(extraction) => {
                println!("{}: {} (confidence: {:.2})",
                    file_result.path,
                    extraction.mime_type,
                    extraction.detection_confidence
                );
            }
            Err(e) => {
                eprintln!("{}: Error - {}", file_result.path, e);
            }
        }
    }
    
    Ok(())
}

CLI Usage

Basic Extraction

# Extract from a single file
omniparse document.pdf

# Extract from multiple files
omniparse file1.txt file2.docx file3.pdf

Output Formats

# JSON output
omniparse --format json document.pdf

# YAML output
omniparse --format yaml document.pdf

# Save to file
omniparse --output results.json --format json document.pdf

Metadata Only

# Extract only metadata, no content
omniparse --metadata-only document.pdf

Type Detection Only

# Detect file type without extraction
omniparse --detect-only unknown_file.bin

Parallel Processing

# Process multiple files in parallel
omniparse --parallel *.pdf

Verbose Output

# Enable verbose logging
omniparse --verbose file1.pdf file2.pdf file3.pdf

Combined Options

# Metadata only, JSON format, parallel processing
omniparse --metadata-only --format json --parallel --output metadata.json *.pdf

Format-Specific Examples

# Extract from HTML files (web pages)
omniparse webpage.html index.htm
omniparse --format json --metadata-only page.html

# Extract from CSS files (stylesheets)
omniparse styles.css theme.css
omniparse --format json stylesheet.css  # Get rule and selector counts

# Extract from RTF files (rich text)
omniparse document.rtf letter.rtf
omniparse --metadata-only report.rtf

# Extract from spreadsheets (Excel and OpenDocument)
omniparse data.xlsx spreadsheet.xls budget.ods
omniparse --format json --output data.json financial.xlsx
omniparse --parallel *.xlsx *.xls *.ods  # Process multiple spreadsheets

# Extract from presentations (PowerPoint and OpenDocument)
omniparse slides.pptx presentation.ppt deck.odp
omniparse --metadata-only quarterly-review.pptx  # Get slide count and metadata
omniparse --format json --output slides.json presentation.pptx

# Extract from legacy Office files (DOC, XLS, PPT)
omniparse document.doc old-report.doc
omniparse spreadsheet.xls data-2010.xls
omniparse presentation.ppt slides-archive.ppt

# Mixed format batch processing
omniparse --parallel --format json --output results.json *.html *.css *.rtf *.xlsx *.pptx

Error Handling

Omniparse provides detailed error types for different failure scenarios:

use omniparse::{extract_from_path, Error};

match extract_from_path("file.xyz") {
    Ok(result) => {
        println!("Success: {}", result.mime_type);
    }
    Err(Error::UnsupportedFormat(mime)) => {
        eprintln!("Format {} is not supported", mime);
    }
    Err(Error::Io(e)) => {
        eprintln!("IO error: {}", e);
    }
    Err(Error::CorruptedFile(msg)) => {
        eprintln!("File is corrupted: {}", msg);
    }
    Err(Error::PartialExtraction { message, partial_result }) => {
        eprintln!("Warning: {}", message);
        println!("Partial content available: {:?}", partial_result.content);
    }
    Err(e) => {
        eprintln!("Error: {}", e);
    }
}

New Format Support

Omniparse has recently added support for 9 additional document formats:

Web Formats

  • HTML: Extract visible text and metadata from web pages
  • CSS: Analyze stylesheets with rule and selector counting

Office Formats

  • XLSX/XLS: Extract data from Excel spreadsheets (modern and legacy)
  • PPTX/PPT: Extract text from PowerPoint presentations (modern and legacy)
  • DOC: Extract content from legacy Word documents

OpenDocument Formats

  • ODS: Extract data from OpenDocument spreadsheets
  • ODP: Extract text from OpenDocument presentations

Rich Text

  • RTF: Extract plain text from Rich Text Format files

See SUPPORTED_FORMATS.md for detailed information about each format.

Performance

Omniparse is designed for performance:

  • Streaming: Large files are processed using streaming to limit memory usage
  • Parallel Processing: Batch operations can leverage multiple CPU cores
  • Pure Rust: No FFI overhead or external process spawning
  • Efficient Detection: Magic byte detection is fast and accurate

Typical performance on standard hardware:

  • Text files (10 MB): < 100ms
  • HTML files (1 MB): < 100ms (actual: ~0.6ms)
  • PDF documents: 200-500ms depending on size
  • XLSX files (10K cells): < 500ms (actual: ~0.9ms for small files)
  • PPTX files (100 slides): < 1000ms (actual: ~0.6ms for small files)
  • Image metadata: < 50ms

All performance targets met or exceeded. See FINAL_PERFORMANCE_SUMMARY.md for comprehensive benchmark results.

Architecture

Omniparse follows a modular architecture:

┌─────────────────┐
│   CLI / API     │
└────────┬────────┘
         │
┌────────▼────────┐
│   Extractor     │
└────┬───────┬────┘
     │       │
┌────▼───┐ ┌▼──────────┐
│Detector│ │  Registry  │
└────────┘ └─────┬──────┘
                 │
         ┌───────┴───────┐
         │    Parsers    │
         ├───────────────┤
         │ Text          │
         │ Document      │
         │ Image         │
         │ Archive       │
         └───────────────┘
  • Extractor: Orchestrates detection and parsing
  • Detector: Identifies file types using multiple methods
  • Registry: Manages available parsers
  • Parsers: Format-specific extraction implementations

Documentation

  • SUPPORTED_FORMATS.md - Complete list of supported formats with detailed information
  • CLI_NEW_FORMATS_GUIDE.md - Comprehensive CLI guide for all newly added formats
  • MIGRATION_GUIDE.md - Guide for upgrading to the latest version with new format support
  • examples/ - Working code examples for all formats
  • API Documentation - Run cargo doc --open for detailed API docs

Contributing

Contributions are welcome! Areas for contribution:

  • Adding support for new file formats
  • Improving type detection accuracy
  • Performance optimizations
  • Documentation improvements
  • Bug fixes

License

Licensed under either of:

at your option.

Acknowledgments

Inspired by Apache Tika, the Java-based content analysis toolkit.

Commit count: 0

cargo fmt