2015-04-20 93 views
1

我想在我的應用程序中使用epub書。 我發現這個鏈接http://www.siegmann.nl/epublib/android打開我的epub書。android epublib訪問css,圖像,url內部文件

我知道如何顯示來自EPUB書的文本,

,但我有一個圖片,CSS文件和鏈接的一個問題。他們的網址是資產文件夾,例如:

文件:///android_asset/index_split_000.html#back_note_1 文件:///android_asset/images/image-1.jpeg

而在資產文件夾沒有像這樣的HTML頁面,沒有圖像文件夾,只有epub壓縮文件。

如何使用所有內部文件?

我的代碼:

WebView webView=(WebView) findViewById(webView); 
List<Chapter> chapters=new ArrayList<Chapter>(); 
AssetManager assetManager = getAssets(); 
    try{ 
     //find input Stream for book 
     InputStream epubInputStream = assetManager.open("xxxxx.epub"); 
     //Load book from input stream 
     book = (new EpubReader()).readEpub(epubInputStream); 

     //Log the book's cover image property 
     Bitmap coverImage =  BitmapFactory.decodeStream(book.getCoverImage().getInputStream()); 
     //Log.i("epublib", "CoverImage is" + coverImage.getWidth()+" by "+coverImage.getHeight()+" pixels"); 

     //Log the tables of contents 
     logTableOfContents(book.getTableOfContents().getTocReferences(),0); 


    } 
    catch(IOException e){ 
     Log.e("epublib", e.getMessage()); 
    } 




private void logTableOfContents(List<TOCReference> tocReferences, int depth) { 

    if (tocReferences == null) { 

     return; 

    } 

    for (TOCReference tocReference : tocReferences) { 

     StringBuilder tocString = new StringBuilder(); 



     try { 
      Chapter chapter=new Chapter(); 

      String s=new String(tocReference.getResource().getData()); 
      chapter.setTitle(tocReference.getTitle()); 
      chapter.setContent(s); 
      chapters.add(chapter); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

     logTableOfContents(tocReference.getChildren(), depth + 1); 

    } 

    } 

章是我自己的類:

public class Chapter { 

String title; 
String content; 

public Chapter(String titlt,String content) { 
    this.title=titlt; 
    this.content=content; 
} 

public Chapter() { 
} 

public String getTitle() { 
    return title; 
} 
public String getContent() { 
    return content; 
} 
public void setTitle(String title) { 
    this.title = title; 
} 
public void setContent(String content) { 
    this.content = content; 
} 

} 

將數據加載到網頁視圖:

webView.loadDataWithBaseURL("file:///android_asset/",chapters.get(index).getContent(), "text/html", "utf-8", null); 

回答

2

一個簡單的方法包括在解壓縮EPUB文件到一個臨時目錄中,然後從那裏加載XHTML文件。通過這種方式,每個XHTML文件中存在的圖像文件,CSS文件等的相關鏈接將由WebView自動解析。

這種技術的一個例子是在這裏:https://github.com/pettarin/epub3reader

當然,你可避免解壓縮整個EPUB文件,而只是「讀」一個XHTML文件到內存(RAM),但如果你這樣做,你必須修補要注入WebView的XHTML源代碼,和/或手動管理圖像/ CSS /等的提取。從當前XHTML引用的文件。如果你的目標是「簡單的」EPUB文件,那麼「只需在tmp目錄下解壓縮」的方法就容易多了。

2

不解壓縮epub庫。

所有你需要做的就是將位圖圖像,你可以很容易使用epublib做。然後,我將它們保存在一個臨時文件夾中,並在html中使用string.replace,以確保html現在指向新的臨時目錄,而不是webview將不知道「/ images」的位置。

通過所有的位圖獲取所有的bipmaps作爲資源

MediaType[] bitmapTypes = { MediatypeService.PNG, MediatypeService.GIF, MediatypeService.JPG }; 
List<Resource> bitmapResources = book.getResources().getResourcesByMediaTypes(bitmapTypes); 

環路作爲資源:

for(Resource r : bitmapResources) { 
      Bitmap bm = BitmapFactory.decodeByteArray(r.getData(), 0, r.getData().length); 
     // store in a public folder on android 
    } 

在網頁視圖替換HTML中, 「/圖片/」 到「chosenfile/tempfolder 「指向臨時文件:

String imagePath = "file://" + Environment.getExternalStorageDirectory().getAbsolutePath() + "/temp_images" + File.separator; 
    text = text.replaceAll("images/", imagePath); 
    webView.loadDataWithBaseURL("", text, "text/html", "UTF-8", ""); 
+0

不能多謝你。先生,你是救命的人。 –