17 stable releases
2.1.2 | May 2, 2024 |
---|---|
2.1.1 | Jun 26, 2023 |
2.0.0 | Dec 29, 2022 |
1.2.4 | Nov 2, 2022 |
0.1.2 | Jan 20, 2017 |
#202 in Filesystem
1,045 downloads per month
Used in 14 crates
(11 directly)
1MB
723 lines
epub-rs
Rust library to support the reading of epub files.
- Documentation: https://docs.rs/epub
- Crate: https://crates.io/crates/epub
Install
Add this to your Cargo.toml
:
[dependencies]
epub = "1.2.2"
MSRV
The minimum supported Rust version is 1.42.0.
lib.rs
:
EPUB library lib to read and navigate through an epub file contents
Examples
Opening
use epub::doc::EpubDoc;
let doc = EpubDoc::new("test.epub");
assert!(doc.is_ok());
let doc = doc.unwrap();
Getting doc metatada
Metadata is a HashMap
storing all metadata defined in the epub
let title = doc.mdata("title");
assert_eq!(title.unwrap(), "Todo es mío");
Accessing resources
In the resources var is stored each resource defined
in the epub indexed by the id and with the full internal
path and mimetype. It's a HashMap<a: String, (b: String, c: String)>
where a
is the resource id, b
is the resource full path and
c
is the resource mimetype
assert_eq!(23, doc.resources.len());
let tpage = doc.resources.get("titlepage.xhtml");
assert_eq!(tpage.unwrap().0, Path::new("OEBPS/Text/titlepage.xhtml"));
assert_eq!(tpage.unwrap().1, "application/xhtml+xml");
Navigating using the spine
Spine is a Vec<String>
storing the epub spine as resources ids
assert_eq!(17, doc.spine.len());
assert_eq!("titlepage.xhtml", doc.spine[0]);
Navigation using the doc internal state
use epub::doc::EpubDoc;
let doc = EpubDoc::new("test.epub");
let mut doc = doc.unwrap();
assert_eq!(0, doc.get_current_page());
assert_eq!("application/xhtml+xml", doc.get_current_mime().unwrap());
doc.go_next();
assert_eq!("000.xhtml", doc.get_current_id().unwrap());
doc.go_next();
assert_eq!("001.xhtml", doc.get_current_id().unwrap());
doc.go_prev();
assert_eq!("000.xhtml", doc.get_current_id().unwrap());
doc.set_current_page(2);
assert_eq!("001.xhtml", doc.get_current_id().unwrap());
assert_eq!(2, doc.get_current_page());
assert!(!doc.set_current_page(50));
// doc.get_current() will return a Vec<u8> with the current page content
// doc.get_current_str() will return a String with the current page content
Getting the cover
use std::fs;
use std::io::Write;
use epub::doc::EpubDoc;
let doc = EpubDoc::new("test.epub");
assert!(doc.is_ok());
let mut doc = doc.unwrap();
let cover_data = doc.get_cover().unwrap();
let f = fs::File::create("/tmp/cover.png");
assert!(f.is_ok());
let mut f = f.unwrap();
let resp = f.write_all(&cover_data);
Dependencies
~4.5–6.5MB
~119K SLoC