Epub电子书实战解析

本文介绍了一个基于epublib库定制的EPUB解析器EpubBook,适用于Android平台的电子图书项目。文章详细解释了如何使用该库解析EPUB文件,包括获取图书基本信息、章节列表和内容等,并对比了其他几款流行的电子书阅读器。
摘要由CSDN通过智能技术生成

图书阅读

  1. Android epub格式解析EpubBook

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的格式提供,你也可以下载源码整合。使用前有两步操作。

  1. 将epubbook.aar导入需要解析epub的module中

  2. 需要使用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


相关链接

  1. Android epub格式解析EpubBook

扩展链接:

  1. epublib项目官方说明地址
  2. epublib项目官方源码地址
  3. epublib项目官方github源码

扩展训练:

  1. 使用epublib框架获取图书
  2. 使用epublib框架解析每章节内容

博客书写不易,您的点赞收藏是我前进的动力,千万别忘记点赞、 收藏 ^ _ ^ !

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值