使用epublib自动生成epub文件

        本文的目的是将获取到的多个网页打包生成epub文件。

        首先简单介绍一下我们使用的工具,epublib,它是一个基于java的开源工具,它可以快捷的生成一个可以使用的epub文件。

        对于epub文件,关于它的标准,我们可以在这里看到。目前已经有了多个版本,最新的版本甚至还支持视频、音频等格式的文件。不过目前多数阅读器尚不支持带有视频、音频文件的epub的阅读。据说iphone上的ibooks支持所有的标准。有兴趣的同学可以研究研究。

        epub文件本质上是一个zip格式的压缩包。我们可以从网上随便下载一个可以阅读的epub电子书,将其后缀改为.zip进行解压,就可以看到其中的详细信息。从解压到的文件中我们可以看出,它主要是通过一个名叫content.opf的文件进行组织的。

使用epublib自动生成epub文件_第1张图片

        但是,我根据他们提供的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自动生成epub文件_第2张图片


        修改后的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 list= new list;
			List list=new ArrayList();
			list.add("publish-哈哈");list.add("publish-嘿嘿");
			book.getMetadata().setPublishers(list);
			list=new ArrayList();
			list.add("Descriptions-哈哈");list.add("Descriptions-嘿嘿");
			book.getMetadata().setDescriptions(list);
			List list2 = new ArrayList();
			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();
		}

	}
}


你可能感兴趣的:(Java)