#epub #ebook #library

rbook

An ebook library that supports parsing and reading the epub format

9 releases (4 breaking)

0.5.0 Apr 9, 2023
0.4.0 Mar 31, 2023
0.3.2 Feb 9, 2023
0.2.0 Feb 4, 2023
0.0.0 Dec 30, 2022

#1041 in Parser implementations

Download history 49/week @ 2024-02-23 141/week @ 2024-03-01 58/week @ 2024-03-08 10/week @ 2024-03-15 5/week @ 2024-03-29

74 downloads per month

Apache-2.0

2MB
2K SLoC

rbook

Crates.io Documentation

An ebook library that supports parsing and reading the epub format.

Usage

Including default features:

[dependencies]
rbook = "0.5.0"

Excluding default features and selection:

[dependencies]
rbook = { version = "0.5.0", default-features = false, features = ["multi-thread"] }

Default features are the following:

  • reader: Enables reading of the ebook file by file.
  • statistics: Enables word/character counting.

Non-default optional features:

  • multi-thread: Enables support for multithreaded environments.

Examples

Other examples can be found in the 'tests' directory.

Opening and reading an epub file:

use rbook::Ebook;

fn main() {
    // Creating an epub instance
    let epub = rbook::Epub::new("example.epub").unwrap();

    // Retrieving the title
    assert_eq!("Jane and John", epub.metadata().title().unwrap().value());

    // Creating a reader instance
    let reader = epub.reader();

    // Printing the contents of each page
    for content_result in &reader {
        let content = content_result.unwrap();
        let media_type = content.get_content(ContentType::MediaType).unwrap();
        assert_eq!("application/xhtml+xml", media_type);
        println!("{}", content);
    }
}

Accessing metadata elements and attributes:

use rbook::Ebook;

fn main() {
    let epub = rbook::Epub::new("example.epub").unwrap();

    // Retrieving the first creator metadata element
    let creator = epub.metadata().creators().first().unwrap();
    assert_eq!("John Doe", creator.value());

    // Retrieving an attribute
    let id = creator.get_attribute("id").unwrap();
    assert_eq!("creator01", id);

    // Retrieving a child element
    let role = creator.get_child("role").unwrap();
    assert_eq!("aut", role.value());

    let scheme = role.get_attribute("scheme").unwrap();
    assert_eq!("marc:relators", scheme);
}

Alternative way of accessing elements:

use rbook::Ebook;
use rbook::xml::Find;

fn main() {
    let epub = rbook::Epub::new("example.epub").unwrap();

    // Retrieving the title
    let title = epub.metadata().find_value("title").unwrap();
    assert_eq!("Jane and John", title);
    
    // Retrieving creator
    let creator = epub.metadata().find_value("creator").unwrap();
    assert_eq!("John Doe", creator);

    // Retrieving role
    let role = epub.metadata().find_value("creator > role").unwrap();
    assert_eq!("aut", role);

    // Retrieving file-as
    let file_as = epub.metadata().find_value("creator > file-as").unwrap();
    assert_eq!("Doe, John", file_as);
}

Extracting images:

use rbook::Ebook;
use std::fs::{self, File};
use std::path::Path;

fn main() {
    let epub = rbook::Epub::new("example.epub").unwrap();

    let img_elements = epub.manifest().images();

    // Create new directory to store extracted images
    let dir = Path::new("extracted_images");
    fs::create_dir(&dir).unwrap();

    for img_element in img_elements {
        let img_href = img_element.value();

        // Retrieve image contents
        let img = epub.read_bytes_file(img_href).unwrap();

        // Retrieve file name from image href
        let file_name = Path::new(img_href).file_name().unwrap();

        // Create new file
        let mut file = File::create(dir.join(file_name)).unwrap();
        file.write_all(&img).unwrap();
    }
}

Sample ebooks

Sample ebooks in the 'tests/ebooks' directory are provided as is from IDPF under the CC-BY-SA 3.0 license.

Dependencies

~13MB
~281K SLoC