epub直接获取书名及书封面

完整的Demo下载GitHub 里面有详细介绍如何使用

一、场景说明

某些场景下我们需要直接获取epub类型书籍的封面及书名,网络上很多文章介绍的都是通过Slf4j等开源库解析,但是这类库往往都是将一整本书籍进行解析后再获取书名等信息,对于一本30M、50M甚至更大的书籍时,往往需要解析很久,而不巧的是我只需要书名、封面,加载其他内容这时候显得有点多余。

首先最好先了解一下epub的一些标准epub文件格式介绍

前戏,先看看效果,是不是你想要的

小米4手机批量解析27本epub时,具体耗时见日志。


二、ePub文件分析

我在这里简单的介绍一下,写的不好的话还请见谅啊,哈哈。

先看下流程图,大体思路也是如此。

1、思路

看懂上面其实就很简单了,没看懂没关系,下面我会详细说明的。

1.1、首先要知道2点:

  1. epub其实就是zip压缩,所以肯定是要先解压文件的,这里注意,我们不能去解压全部文件,这样遇到大文件时必然还是会很耗时,最优的肯定是解压单个目标文件。
  2. 大部分文件主要是以xml文件为主。

1.2、思路详解

首先我们先用zip将epub书籍解压,这里为了大家更直观,我用了2本目录结构不同的书本。

1号书目录结构如下:

2号书目录结构如下:

根据epub标准规范规定,META-INF文件是必然存在的,详见epub文件格式介绍。

打开META-INF文件目录下的container.xml文件,里面记录着一个重要文件的路径(content.opf)。这是比较关键性的一步,我们要根据rootfile标签,取得full-path的值,也就得到了content.opf路径。

找到content.opf文件,并打开(剩下的都步骤都一样,我这里开始主要以2号书籍为例)。可以看到一些关键的信息已经展现在我们面前了,书名、作者、出版社、时间、目录等等。想要什么大家都可以自己去发挥啦。

而且OPF文件实际也是xml内容,所以用xml解析就行了。

注:这里封面图片要注意一下,先要找到mate标签且属性name为“cover”,然后得到其中属性content的值"cover-image",接着在manifest下众多Item标签中找到ID名对应刚刚的"cover-image",里面的属性href记录着封面图片的路径。如果找不到mate标签且name为“cover”的话说明此书无封面

三、代码

1、代码思路

步骤如下:

  • 解压MEIA-INF文件夹。
  • 解析MEIA-INF文件夹下的container.xml,取得content.opf路径。
  • 根据取得的content.opf路径,解压其文件。
  • 解析content.opf取得书名和图片路径。
  • 根据图片路径,解压文件夹取得图片的bitmap。

4、上代码

思路看懂了的话,代码其实也没什么好讲的了,具体看注释吧。

ReadEpubHeadInfo类,主要用于解析epub书本,返回一个BookModel对象,对象内部有书名等属性。

/*** @作者: JJ* @创建时间: 2018/9/12 上午11:58* @Version 1.0* @描述: 直接获取Epub的书名+封面图片。*/
public class ReadEpubHeadInfo {/*** 存储content.opf文件路径*/private static final String META_INF_CONTAINER = "META-INF/container.xml";/*** 默认解压后进行暂存的地址*/private static String SAVE_INFO_PATH = "/sdcard/aEpubHeadInfo/";/*** 默认图片存放路径*/private static String SAVE_IMAGE_PATH = "/sdcard/aResult/";public String getSaveInfoPath() {return SAVE_INFO_PATH;}public void setSaveInfoPath(String saveInfoPath) {SAVE_INFO_PATH = saveInfoPath;}public ReadEpubHeadInfo() {}public static BookModel getePubBook(String ePubPath) {if (TextUtils.isEmpty(ePubPath))return null;if (!FileUtils.getFileExtension(ePubPath).equals("epub")) {return null;}BookModel book = new BookModel();//之前是否有缓存,清空if (FileUtils.isDir(SAVE_INFO_PATH)) {FileUtils.deleteDir(SAVE_INFO_PATH);}try {//存储content.opf文件路径信息String contentOpfPath = "";LogUtils.d("epub", "1.解压MEAT-INF文件 " + ePubPath);//1.解压MEAT-INF文件,解析container.xml的rootfile标签,获取content.opf的路径。if (ZipUtils.zipSpecifiedFile(ePubPath, SAVE_INFO_PATH, META_INF_CONTAINER)) {contentOpfPath = XmlUtils.xmlSubtagNameAnalysis(SAVE_INFO_PATH + META_INF_CONTAINER, "rootfiles", "rootfile", "full-path");} else {LogUtils.e("epub解析", ePubPath + "解析错误,请检查书本");return null;}LogUtils.d("epub", "2.解压获取到的content.opf路径 " + ePubPath);//2.解压获取到的content.opf路径,并用xml解析获取title信息if (ZipUtils.zipSpecifiedFile(ePubPath, SAVE_INFO_PATH, contentOpfPath)) {book.setName(XmlUtils.xmlSubtagNameAnalysis(SAVE_INFO_PATH + contentOpfPath, "metadata", "title", null));book.setAuthor(XmlUtils.xmlSubtagNameAnalysis(SAVE_INFO_PATH + contentOpfPath, "metadata", "creator", null));//3.获取封面图片路径LogUtils.d("epub", "3.获取封面图片路径 " + ePubPath);String imgXmlFlag = XmlUtils.xmlSubtagConditionAnalysis(SAVE_INFO_PATH + contentOpfPath, "metadata", "name", "cover", "content");if (imgXmlFlag != null) {String imgPath = "";String[] content = contentOpfPath.split("/");for (int i = 0; i < content.length - 1; i++) {imgPath += content[i] + "/";}String[] sourceBookName = ePubPath.split("/");imgPath += XmlUtils.xmlSubtagConditionAnalysis(SAVE_INFO_PATH + contentOpfPath, "manifest", "id", imgXmlFlag, "href");String saveImagePath = SAVE_IMAGE_PATH + FileUtils.delFileSuffix(sourceBookName[sourceBookName.length - 1]) + "/";LogUtils.d("epub", "4.根据路径解压图片 " + ePubPath);//4.根据路径解压图片if (ZipUtils.zipSpecifiedFile(ePubPath, saveImagePath, imgPath)) {book.setCover(saveImagePath + imgPath);} else {book.setCover(null);}LogUtils.d("epub", "完成 " + ePubPath);}} else {LogUtils.e("epub解析", ePubPath + "解析错误,请检查书本(可能原因,书籍被加密)");return null;}} catch (Exception e) {return null;}if (book.getName() == null) {//获取文件名,作为备用,如果获取不到书名的话用文件名代替book.setName(new File(ePubPath).getName());}return book;}
}

完整的Demo下载GitHub 里面有详细介绍如何使用

第一次接触书本解析相关内容,有写的不好的地方希望大佬们留言指正。感谢!感谢!感谢。

epub直接获取书名及书封面相关推荐

  1. python获取b站视频封面及弹幕

    python网络爬虫 利用python获取b站视频封面及弹幕 获取弹幕 获取封面 完整代码 利用python获取b站视频封面及弹幕 获取弹幕 从https://api.bilibili.com/x/v ...

  2. 分享:制作属于自己的O'REILLY“动物书”封面

    个人是非常喜欢O'REILLY的"动物书"系列. 也陆陆续续买了很多本. 很多出现在O'REILLY图书封面的动物已经灭绝或者濒临灭绝. 如果希望为保护它们尽一份力量可以访问以下O ...

  3. 计算机职业生涯规划书素材,职业生涯规划书封面素材

    职业生涯规划书封面素材 职业生涯规划是指针对个人职业选择的主观和客观因素进行分析和测定,确定个人的奋斗目标并努力实现这一目标的过程.换句话说,职业生涯规划要求根据自身的兴趣.特点,将自己定位在一个最能 ...

  4. 如何做小红书封面?笔记要爆封面设置少不了

    为什么你认认真真写的小红书笔记,浏览量寥寥无几,互动只有个位数.而其他人写的类似内容,却成了爆款?可能是封面出了问题.今天跟大家聊聊如何做小红书封面更容易出爆款. 在小红书平台,女性用户占比较高,每个 ...

  5. 使用稿定设计怎么制作小红书封面图

    制作小红书封面图,大家赶紧来体验用稿定设计制作吧,如果想要了解更多办公方面的应用工具,可以进入到赛效官方网站查看应用问答或应用资讯栏目了解更多. 小红书一款可以将好物和网络上的人进行分享的信息平台,在 ...

  6. 四个步骤,获取公众号文章封面图

    公众号也玩了好多年了,经常有朋友在后台私信问我:xxx文章的封面图可以发一下吗?也怪我,没有保留素材的习惯,就导致好多次都找不到原图了 相信很多朋友也有类似的情况,遇到喜欢的封面图后,发现推文正文中并 ...

  7. mp4视频获取时长、封面图、编码、转码(mpeg4转h264)工具类

    application.properties server.port=8908 file.uploadfolder=D:/school/ #分片文件临时目录 file.chunkfolder=D:/s ...

  8. 获取英文期刊的封面及目录

    通过期刊编辑部获取.直接给编辑部的 Journal Manager 发邮件,索取封面和目录. 以 Elsevier 旗下期刊为例:使用"通讯作者"邮箱发邮件到support_chi ...

  9. iOS获取相册视频文件封面图 选取手机中的音频、视频文件并导出数据。

    应项目需求,需要实现本地选取并上传图片.音频和视频文件. 其中选取图片这块有很多开源框架,不再赘述.本文主要是采用iOS自带的类MPMediaPickerController 来实现UIImagePi ...

最新文章

  1. java.util.concurrent介绍
  2. python中函数和方法的区别
  3. 【maven插件】maven-help-plugin
  4. stopped状态的进程 top 命令_30 个实例详解 TOP 命令!
  5. kafka权威指南读书心得
  6. python 网页截图不全_Selenium webdriver 截图 太长截不全的问题
  7. cpci无法检索_CPCI检索是什么意思
  8. DL | DeepDream过程和原理概要
  9. 机器学习模型效果评估指标与方法介绍
  10. Dialog加载页面动画(Loding.....加载等待)三种方式
  11. Paper reading (二十二):Integrated omics: tools, advances and future approaches
  12. 用HTML制作代码雨源码分享
  13. Qt 图像放大缩小拖动
  14. ValueError: With n_samples=1, test_size=0.2 and train_size=None, the resulting train set will be emp
  15. 【最经典的79个】软件测试面试题(内含答案)都是可以提前准备的!
  16. python类中的属性分为类属性和实例属性两种_python从入门到大神---1、初始化实例、类属性、方法...
  17. android h264转yuv,Android使用MediaCodec将YUV硬编成H264
  18. 打死我也不说,你还没使美人儿计呢!
  19. 运维工程师必备技能之操作系统运维(一)
  20. 团体天梯 L3-022 地铁一日游 (30 分)(测试点分析 and 推荐测试样例)

热门文章

  1. php 递归无限极分类和层级展示(适用于权限管理和分类管理功能)
  2. 一条大蟒蛇和一条小毒蛇
  3. VTK 学习----3D基础知识-着色器和图形管道
  4. 服务器灰度部署和原理
  5. 弘玑Cyclone联合北京大学共建中国首个超级自动化校企联合实验室
  6. ×××网站与***的秘密
  7. Android 系统截屏实现
  8. 用Python制作一条五彩蟒蛇
  9. 极速安装和体验k8s(Minikube)
  10. linux 关闭zombie进程