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 |
|
#1285 in 解析器实现
每月129次下载
2MB
2K SLoC
rbook
支持解析和读取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