首页 > 其他分享 >epub文件解压

epub文件解压

时间:2023-06-28 23:44:48浏览次数:40  
标签:解压 文件 resource epublib siegmann new import nl epub

<dependency>
<groupId>com.positiondev.epublib</groupId>
<artifactId>epublib-core</artifactId>
<version>3.1</version>
</dependency>
<!--html解析 -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>

===================================
package com.example.demo.ebook;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.List;

import nl.siegmann.epublib.domain.Book;
import nl.siegmann.epublib.domain.MediaType;
import nl.siegmann.epublib.domain.Metadata;
import nl.siegmann.epublib.domain.Resource;
import nl.siegmann.epublib.domain.Resources;
import nl.siegmann.epublib.domain.Spine;
import nl.siegmann.epublib.domain.SpineReference;
import nl.siegmann.epublib.domain.TOCReference;
import nl.siegmann.epublib.domain.TableOfContents;
import nl.siegmann.epublib.epub.EpubReader;

public class EbookMain {
public static void main(String[] args) {

File file = new File("/Users/xiejianwu/Desktop/ebook/ebook.epub");
InputStream in = null;
try {
//从输入流当中读取epub格式文件
EpubReader reader = new EpubReader();
in = new FileInputStream(file);
Book book = reader.readEpub(in);

book.getTableOfContents()

book.getContents();

//获取到书本的头部信息
Metadata metadata = book.getMetadata();
System.out.println("FirstTitle为:"+metadata.getFirstTitle());
//获取到书本的全部资源
Resources resources = book.getResources();
System.out.println("所有资源数量为:"+resources.size());
//获取所有的资源数据
Collection<String> allHrefs = resources.getAllHrefs();
for (String href : allHrefs) {
Resource resource = resources.getByHref(href);
//data就是资源的内容数据,可能是css,html,图片等等
byte[] data = resource.getData();
// 获取到内容的类型 css,html,还是图片
MediaType mediaType = resource.getMediaType();

String title = resource.getTitle();






}
//获取到书本的内容资源
List<Resource> contents = book.getContents();
System.out.println("内容资源数量为:"+contents.size());
//获取到书本的spine资源 线性排序
Spine spine = book.getSpine();
System.out.println("spine资源数量为:"+spine.size());
//通过spine获取所有的数据
List<SpineReference> spineReferences = spine.getSpineReferences();
for (SpineReference spineReference : spineReferences) {
Resource resource = spineReference.getResource();
//data就是资源的内容数据,可能是css,html,图片等等
byte[] data = resource.getData();
// 获取到内容的类型 css,html,还是图片
MediaType mediaType = resource.getMediaType();

System.out.println("mediaType1 = "+mediaType+"--"+resource.getTitle()+"--"+resource.getId());


FileOutputStream output = new FileOutputStream(new File("/Users/xiejianwu/Desktop/ebook/test/"+resource.getId()));

BufferedOutputStream bufferedOutput = new BufferedOutputStream(output);

InputStream input = resource.getInputStream();


try {
// 读数据
int len = 0;
byte[] bytes = new byte[1024];
while ((len=input.read(bytes))!=-1){
// 写数据
bufferedOutput.write(bytes,0,len);
}
}finally {
bufferedOutput.close();
input.close();
}


}
//获取到书本的目录资源
TableOfContents tableOfContents = book.getTableOfContents();
System.out.println("目录资源数量为:"+tableOfContents.size());
//获取到目录对应的资源数据
List<TOCReference> tocReferences = tableOfContents.getTocReferences();
for (TOCReference tocReference : tocReferences) {
Resource resource = tocReference.getResource();
//data就是资源的内容数据,可能是css,html,图片等等
byte[] data = resource.getData();
// 获取到内容的类型 css,html,还是图片
MediaType mediaType = resource.getMediaType();
if(tocReference.getChildren().size()>0){
//获取子目录的内容
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//一定要关闭资源
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}



public static void wordCopy(File file){
FileInputStream fis = null;
FileOutputStream fos = null;

// 准备好复制过来的文件的新名字
String[] names = file.getPath().split("\\.");
String name = names[0]+"Copy."+names[1]; // 重命名
try {
// 文件字节输出、输出流对象
fis = new FileInputStream(file);
fos = new FileOutputStream(name);
// 读数据
int len = 0;
byte[] bytes = new byte[1024];
while ((len=fis.read(bytes))!=-1){
// 写数据
fos.write(bytes,0,len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
// 释放资源
fis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}

}



}



}

标签:解压,文件,resource,epublib,siegmann,new,import,nl,epub
From: https://www.cnblogs.com/ENU7/p/17512840.html

相关文章

  • Linux - Docker日志文件清理
    1.容器日志文件默认存放路径:/var/lib/docker,docker日志文件后缀是containerID+"-json.log",     查看各个日志文件大小:   1) ls-lh$(find/var/lib/docker/containers/-name*-json.log)       查询结果sample:  -rw-r-----1rootroot2......
  • inotifywait 监控文件修改实时格式化文件
    我们在学习laravel过程中,从文档网页复制代码,会有一些比较麻烦的问题。以《Laravel10中文文档》|LaravelChina社区(learnku.com)为例 直接点复制按钮会带后,想测试的代码的话,还有处理use语句选中复制时,网站会向剪贴板追加来源信息,还得手动处理。 这些手动处理......
  • 在vue文件中使用 deep深度选择器
    使用场景有的时候我们需要在父组件中去修改第三方组件或者子组件的样式就会使用到deep深度选择器。比如:App组件中定义了.title的样式,也想让Test子组件中的.title也应用对应的样式App.vue<template><divclass="app"><h1>app组件</h1><divclass="title">这是app......
  • 为什么在 C++ 中,类的静态成员变量需要在源文件中进行定义?
    为什么在C++中,类的静态成员变量需要在源文件中进行定义?类的静态成员变量需要在源文件中进行定义,以便在链接阶段能够正确地分配内存并为其分配地址。当你在类的头文件中声明一个静态成员变量时,这只是告诉编译器该变量存在,并将在某处定义。这是因为头文件通常被包含在多个源文件......
  • 头文件
        ......
  • gitignore 忽略文件不生效处理
    在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中.gitignore文件的方法。但是有时候在项目开发过程中,因为忘记加上.gitignore忽略文件,导致编译的代码已经上传到Git服务器上面了,这时候即使把Git仓库上面的文件夹删掉了也没有用,因为已经被Gittrack......
  • webuploader http大文件断点续传上传
    ​ javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1.通过form表单向后端发送请求         <formid="postForm"action="${pageContext.request.contextPath}/UploadServlet"method="post"e......
  • 给ansible的hosts文件加密及使用方法
    转: https://blog.csdn.net/Li_haiyu/article/details/125774440  ......
  • C#保存doc文件
    1、使用office组件(Microsoft.Office.Interop.Word)https://www.cnblogs.com/Joyce-mi7/p/17445396.html2、使用免费的 Spire.Dochttps://www.cnblogs.com/HoFei/p/17425140.html3、使用DocX插件https://blog.csdn.net/zhanfu2905/article/details/68948002https://www.cnblo......
  • csharp http大文件断点续传上传
    ​IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头。 一. 两个必要响应头Accept-Ranges、ETag        客户端每次提交下载请求时,服务端都要添加这两个响应头,以保证客户端和服务端将此下载识别为可以断点续传......