android平台解析epub--epublib

android下解析epub格式书籍的相关资料不多,查了很久找出了一些相关资料,找到了一个epublib包,

Epublib开发android的主页:http://www.siegmann.nl/epublib/android

相关jar包下载:https://github.com/downloads/psiegman/epublib/epublib-core-latest.jar

http://www.slf4j.org/android/slf4j-android-1.6.1-RC1.jar

在线API:http://www.siegmann.nl/static/epublib/apidocs/

具体的书籍信息提取代码如下:

package com.zyj.ui;



import java.io.IOException;

import java.io.InputStream;



import nl.siegmann.epublib.domain.Book;

import nl.siegmann.epublib.domain.Metadata;

import nl.siegmann.epublib.domain.Resource;

import nl.siegmann.epublib.epub.EpubReader;

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.os.Bundle;

import android.widget.ImageView;

import android.widget.TextView;



public class MainActivity extends Activity {

    /** Called when the activity is first created. */

 private TextView bookInfoText;

 private ImageView coverImage;

 

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        

        setContentView(R.layout.main);

        

        bookInfoText = (TextView) findViewById(R.id.bookInfoText);

        coverImage = (ImageView) findViewById(R.id.coverImage);

        

        

  try {

   InputStream is = getAssets().open("timefriend.epub");

   Book book = new EpubReader().readEpub(is);

   

   

   Metadata metadata = book.getMetadata();

   

   String bookInfo = "作者:"+metadata.getAuthors()+

     "\n出版社:"+metadata.getPublishers()+

     "\n出版时间:" +metadata.getDates()+

     "\n书名:"+metadata.getTitles()+

     "\n简介:"+metadata.getDescriptions()+

     "\n语言:"+metadata.getLanguage()+

     "\n\n封面图:";

   bookInfoText.setText(bookInfo);

   

   

   nl.siegmann.epublib.domain.Resources ress = book.getResources();

   Resource res = ress.getById("cover");

   byte[] data = res.getData();

   Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

   coverImage.setImageBitmap(bitmap);

   

  } catch (IOException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

        

    }

}

说明:epub格式的书籍其实就一个zip压缩包,可以将其后缀名改为.zip然后解压缩后查看文件目录。

遇到的问题:

在获取书籍封面图片的时候通过epub主页提供的方法

Bitmap coverImage = BitmapFactory.decodeStream(book.getCoverImage()
          .getInputStream());

中book.getCoverImage()得到的对象为null,查看解压后的文件后发现很多epub格式的书籍中都没有将封面图片的信息放到<metadata>标签下的cover标签中。

解决办法:通过book.getResources()获得Resources对象,然后通过方法getById("cover")获得Resource对象,这样就可以取到封面图信息了。

程序运行截图:

android平台解析epub--epublib

案例2:

下面是在java中解析epub电子书 可以将epub电子书中的书名、封面、目录、内容(html格式)读取出来 

//目录

Collection<String> hrefs = book.getResources().getAllHrefs();

Iterator<String> it = hrefs.iterator();

while(it.hasNext()){

   system.out.println(it.next());

}



//读取书的内容,但是这种读取方式下,书的格式会乱,插图也无法显示

List<Resource> list = book.getContents();

StringBuffer sb = new StringBuffer();

for(int i=0;i<list.size();i++){

   Resource res = list.get(i);

   byte[] resdata = res.getData();

   String str = new String(resdata,"utf-8");

   sb.append(str);   

}



//用WebView显示书的内容,此时格式已经乱了

bookContent = (WebView)findViewById(R.id.bookContent);

//设置webView属性,能够执行javascript

bookContent.getSettings().setJavaScriptEnabled(true);

bookContent.loadDataWithBaseURL(null,sb.toString(),"text/html","utf-8",null);

 

你可能感兴趣的:(android)