本文的目的是将获取到的多个网页打包生成epub文件。
首先简单介绍一下我们使用的工具,epublib,它是一个基于java的开源工具,它可以快捷的生成一个可以使用的epub文件。
对于epub文件,关于它的标准,我们可以在这里看到。目前已经有了多个版本,最新的版本甚至还支持视频、音频等格式的文件。不过目前多数阅读器尚不支持带有视频、音频文件的epub的阅读。据说iphone上的ibooks支持所有的标准。有兴趣的同学可以研究研究。
epub文件本质上是一个zip格式的压缩包。我们可以从网上随便下载一个可以阅读的epub电子书,将其后缀改为.zip进行解压,就可以看到其中的详细信息。从解压到的文件中我们可以看出,它主要是通过一个名叫content.opf的文件进行组织的。
但是,我根据他们提供的Example,并不能得到可以打开的epub文件,而且由于epublib版本的升级,它给出的示例并没有进行相应的升级,导入到eclipse中的时候是有错误的。经过分析,问题出在了content.opf文件中,其中的一些字符串和可以读取的epub文件相应位置的字符串不是很一样。这可能和我们所使用的阅读器有关系,我使用了两个阅读器,一个是Adobe的Adobe Digital Editions 2.0,还有一个是Fbreader的windows版。
然后,我就分析了一个epublib的源代码,将其中的一部分的字符串生成部分进行了修改,最终就可以生成可以打开的epub文件了。
下边给出我修改过的epublib源码,以及一个Main示例。将其复制到eclipse中,并将新建文件夹复制到c盘book1文件中即可。运行后会生成一个名叫test.pub的文件。
修改后的epublib源码下载地址:http://download.csdn.net/detail/u012314976/6771579
另外,github的源码包中并没有给出相应的依赖包,分别是kxml2-2.3.0.jar,slf4j-api-1.7.5.jar,slf4j-simple-1.7.5.jar,在源码包中也一并给出。
大家还有什么问题,可以跟帖留言,我将会及时回复。
最后附上我们的Main函数:
package com.zhyoulun.test;
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.ArrayList;
import java.util.List;
import java.util.zip.ZipFile;
import nl.siegmann.epublib.domain.Author;
import nl.siegmann.epublib.domain.Book;
import nl.siegmann.epublib.domain.Date;
import nl.siegmann.epublib.domain.Resource;
import nl.siegmann.epublib.domain.ResourceInputStream;
import nl.siegmann.epublib.domain.Spine;
import nl.siegmann.epublib.epub.EpubWriter;
import nl.siegmann.epublib.service.MediatypeService;
public class Main
{
public static final String DISK_DIR_ROOT = "C:/book1/";
public static void main(String[] args)
{
try
{
Book book = new Book();
book.getMetadata().addTitle("三国演义");
book.getMetadata().addAuthor(new Author("罗贯中", "吴承恩"));
book.getMetadata().addContributor(new Author("zhang"));
book.getMetadata().addPublisher("zhang");
//List<String> list= new list;
List<String> list=new ArrayList<String>();
list.add("publish-哈哈");list.add("publish-嘿嘿");
book.getMetadata().setPublishers(list);
list=new ArrayList<String>();
list.add("Descriptions-哈哈");list.add("Descriptions-嘿嘿");
book.getMetadata().setDescriptions(list);
List<Date> list2 = new ArrayList<Date>();
list2.add(new Date(new java.util.Date()));
book.getMetadata().setDates(list2);
book.getMetadata().setSubjects(list);
book.addSection("introduce", new Resource(new FileInputStream(
new File(DISK_DIR_ROOT + "haha.html")), "haha.html"));
// book.setCoverImage(new Resource(new FileInputStream(new File(
// DISK_DIR_ROOT + "cover.png")), "cover.png"));
EpubWriter epubWriter = new EpubWriter();
epubWriter.write(book, new FileOutputStream(new File("test.epub")));
System.out.println("ok");
} catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}