12 releases (stable)

1.2.0 Sep 25, 2018
1.1.1 Dec 13, 2017
1.0.5 Jul 31, 2017
1.0.3 Mar 13, 2017
0.1.2 Jan 20, 2017

#3 in #epub

Download history 1/week @ 2019-01-24 2/week @ 2019-01-31 3/week @ 2019-02-07 4/week @ 2019-02-14 6/week @ 2019-02-21 45/week @ 2019-02-28 13/week @ 2019-03-07 6/week @ 2019-03-14 109/week @ 2019-03-21 71/week @ 2019-03-28 19/week @ 2019-04-04 18/week @ 2019-04-11 33/week @ 2019-04-18 15/week @ 2019-04-25

194 downloads per month
Used in 1 crate

GPL-3.0 license

1MB
592 lines

epub-rs

Rust library to support the reading of epub files.


lib.rs:

EPUB library lib to read and navigate throught 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

# use epub::doc::EpubDoc;
# let doc = EpubDoc::new("test.epub");
# let doc = doc.unwrap();
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

# use epub::doc::EpubDoc;
# use std::path::Path;
# let doc = EpubDoc::new("test.epub");
# let doc = doc.unwrap();
assert_eq!(21, 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 usint the spine

Spine is a Vec storing the epub spine as resources ids

# use epub::doc::EpubDoc;
# let doc = EpubDoc::new("test.epub");
# let doc = doc.unwrap();
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).is_err());

// 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

~3.5MB
~57K SLoC