#epub #ebook #library

rbook

支持解析和读取epub格式的电子书库

9个版本 (4个重大更改)

0.5.0 2023年4月9日
0.4.0 2023年3月31日
0.3.2 2023年2月9日
0.2.0 2023年2月4日
0.0.0 2022年12月30日

#1285 in 解析器实现

Download history 10/week @ 2024-03-15 5/week @ 2024-03-29

每月129次下载

Apache-2.0

2MB
2K SLoC

rbook

Crates.io Documentation

支持解析和读取epub格式的电子书库。

用法

包含默认功能

[dependencies]
rbook = "0.5.0"

排除默认功能和选择

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

默认功能包括以下内容

  • reader:允许按文件读取电子书。
  • statistics:启用单词/字符计数。

非默认可选功能

  • multi-thread:启用对多线程环境的支持。

示例

其他示例可以在'tests'目录中找到。

打开和读取epub文件

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);
    }
}

访问元数据元素和属性

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);
}

访问元素的另一种方式

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);
}

提取图片

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();
    }
}

示例电子书

'tests/ebooks'目录中提供的示例电子书来自IDPF,并按照CC-BY-SA 3.0许可证提供。

依赖项

~13MB
~288K SLoC