图书阅读
Android电子书epub解析
博客创建时间:2021.04.20
博客更新时间:2021.04.22
以Android studio build=4.1.3,gradle=6.5,SdkVersion 30来分析讲解。如图文和网上其他资料不一致,可能是别的资料版本较低而已
前言
最近公司要做Android 图书阅读器,需要解析epub格式的图书。
本博客是根据epublib库进行个人定制化的修改,为了适用于电子图书项目。通过自己再一次的封装,将epublib以更简单的接口方式提供给使用者和协作者。文尾提供源码
demo效果图
EpubBook使用
资源以aar的格式提供,你也可以下载源码整合。使用前有两步操作。
-
将epubbook.aar导入需要解析epub的module中
-
需要使用epub解析的module配置依赖
implementation 'org.jsoup:jsoup:1.11.3'
1. EpubBean
图书信息类,图书解析出来后包含各种内容,除了包含作者、书名等基础信息外,还包含章节列表和图书图片等。
public class EpubBean {
/**
* 书名
*/
@Nullable
public String title;
/**
* 作者
*/
@Nullable
public String author;
/**
* 出版社
*/
@Nullable
public String publisher;
/**
* 简介
*/
@Nullable
public String description;
/**
* 出版时间
*/
@Nullable
public String time;
/**
* 图书语言
*/
@Nullable
public String language;
/**
* 分类、科目
*/
@Nullable
public String subject;
/**
* 图书章节目录列表
*/
@Nullable
public List<ChapterBean> list;
/**
* 图书的图片
*/
@Nullable
public Bitmap bitmap;
}
2. ChapterBean
章节列表信息类,包含章节名和相对地址。
public class ChapterBean {
@Nullable
public String tilte;
/**
* 章节资源的href,根据该参数能快速找到章节内容
*/
@Nullable
public String href;
/**
* resource的大小
*/
public int size;
}
3. BookHelper
图书的操作类,使用中主要使用到该类。
注意:EpubHelper中的方法都是耗时操作,请开子线程操作。
/**
* 解析图书
*
* @param in 图书输入流
* @return 图书,可能返回null
*/
@Nullable
public EpubBean parseEpubBook(@Nullable InputStream in) {
Book book = getEpubBook(in);
if (book == null) {
return null;
}
return parseBook(book);
}
/**
* 解析图书
*
* @param bookFile 图书文件
* @return 图书,可能返回null
*/
@Nullable
public EpubBean parseEpubBook(@Nullable File bookFile) {
Book book = getEpubBook(bookFile);
if (book == null) {
return null;
}
return parseBook(book);
}
/**
* 解析图书
*
* @param bookFile 图书文件
* @return 图书,可能返回null
*/
@Nullable
public EpubBean parseEpubBookLazy(@Nullable File bookFile) {
Book book = getEpubBookLazy(bookFile);
if (book == null) {
return null;
}
return parseBook(book);
}
/**
* 获得章节内容
*
* @param in 文件输入流
* @param href href路径
* @return 返回 html 字符串
*/
@Nullable
public String getChapterContent(@Nullable InputStream in, @Nullable String href) {
if (in == null || href == null) {
return null;
}
EpubReader reader = new EpubReader();
Book book = reader.readEpub(in);
Resource resource = book.getResources().getByHref(href);
//和 resource.getInputStream() 返回的都是html格式的文章内容,只不过读取方式不一样
byte[] data = resource.getData();
return StringUtils.bytes2Hex(data);
}
4.使用方式
如下使用,可以获得基本信息和章节目录列表及图书图片
bookBean = helper.parseEpubBook(in);
binding.tvText.setText(bookBean.toString());
Bitmap bitmap = bookBean.bitmap;
if (bitmap != null) {
binding.image.setImageBitmap(bookBean.bitmap);
}
mAdatper.setList(bookBean.list);
如下即可获得每个章节中的文本内容
EpubHelper epubHelper = new EpubHelper();
String strHtml1 = epubHelper.getChapterContent(in, href);
if(strHtml1!=null){
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadDataWithBaseURL(null, strHtml1, "text/html", "utf-8", null);
}
知识扩充
除了epubLib框架,还有很多其他的阅读器开源框架。
1. Book Reader
那我们先从我最喜欢的一款开源安卓电子书阅读器开始:Book Reader。它基于现在专有的 FBReader 应用的开源老版本。
像 FBReader 的早期版本一样,Book Reader 小而简单,但是好用。
相关链接:
1.https://github.com/androiddream/BookReader
2.https://github.com/foobnix/LibreraReader/
2. Cool Reader
Cool Reader 是一个灵活易用的电子书软件。虽然我觉得该软件的图标会让想起 Windows vista 中的图标,但它确实有一些好用的功能。
相关链接:https://github.com/blchinezu/pocketbook-coolreader
3. Readium
Readium是一个由Readium基金会开发的,适用于Android与IOS平台的阅读器项目。与最同类的FBReader相比,最大的区别就是将电子书的解析与展示都交给了WebView来实现,并通过css与js来实现电子书的阅读效果。
相关链接:
1.https://github.com/readium/SDKLauncher-Android
2.https://readium.org/
4.Folioreader
FolioReaderKit是一个用Swift编写的iOS的ePub阅读器和解析器框架,有众多出色的优点。
https://github.com/FolioReader/FolioReader-Android
implementation "com.folioreader:folioreader:0.5.4"
总结
每个平台的epub电子图书都可能存在一定的差异,导致解析出来的结果有部分差异,使用中可能需要自己不断手动兼容新情况。
epub电子图书的内容resource都是以16进制byte[]保存的,使用前都需要先转为String在进行解析等操作。
下一篇博文将对另一种epub解析框架Folioreader进行研究分享。
源码:
https://gitee.com/luofaxin/EpubDemo.git
https://github.com/l424533553/EpubDemo.git
相关链接:
扩展链接:
扩展训练:
- 使用epublib框架获取图书
- 使用epublib框架解析每章节内容
博客书写不易,您的点赞收藏是我前进的动力,千万别忘记点赞、 收藏 ^ _ ^ !