6

I am using epublib to read a .epub file in a WebView.

WebView wv = (WebView) getView().findViewById(R.id.chaptercontent);
    try {
        String abspath = FILEPATH+file;
        File filePath = new File(abspath+".epub");   
        InputStream epubInputStream = new BufferedInputStream(new FileInputStream(filePath));
        book = (new EpubReader()).readEpub(epubInputStream);
        int pos = abspath.lastIndexOf('/');
        DownloadResource(abspath.substring(0, pos));
        try {
            for(int i = 1; i< book.getContents().size(); i++) {
                InputStream is = book.getSpine().getSpineReferences().get(i).getResource().getInputStream(); 
                BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
                StringBuilder sb = new StringBuilder(); 
                String line = null; 
                while ((line = reader.readLine()) != null)
                { 
                    sb.append(line + "\n");
                    Log.d("display line", line);
                } 
                is.close(); 
                wv.loadDataWithBaseURL(abspath.substring(0, pos)+"/", sb.toString(), "text/html", "utf-8", null);
            }
        }   
        catch(IOException e) {
            Log.e("IOException", e.getMessage());
        }   
     }
     catch (IOException e) {
        Log.e("epublib", e.getMessage());
     }

private void DownloadResource(String directory) {
     try {
         nl.siegmann.epublib.domain.Resources rst = book.getResources();
         Collection<Resource> clrst = rst.getAll();
         Iterator<Resource> itr = clrst.iterator();
         Log.d("Downlod path", directory);
         while (itr.hasNext()) {
             Resource rs = itr.next();
             if ((rs.getMediaType() == MediatypeService.JPG) || (rs.getMediaType() == MediatypeService.PNG) || (rs.getMediaType() == MediatypeService.GIF) || rs.getMediaType() == MediatypeService.CSS)  {
                 File oppath1 = new File(directory+File.separator+rs.getHref());
                 Log.d("Resource Name - ", rs.getHref());
                 oppath1.createNewFile();
                 Log.d("Oppath - ", oppath1.getAbsolutePath());

                 Log.d("File Checking - ", "Exists - "+oppath1.exists()+" & Write - "+oppath1.canWrite());
                 FileOutputStream fos1 = new FileOutputStream(oppath1);
                 fos1.write(rs.getData());
                 fos1.close();

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

The DownloadResource works fine. The resources are fetched. But the WebView is not displaying the image. The images are in the same directory as the epub file. The WebView gives me this:

Waynn Lue
  • 11,048
  • 7
  • 49
  • 71
Aravind Srivatsan
  • 435
  • 1
  • 5
  • 15

2 Answers2

2

It's been while for this problem but if anyone encountered it, I encountered the same problem and the solution was pretty simple which got ignored.

wv.loadDataWithBaseURL(abspath.substring(0, pos)+"/", sb.toString(), "text/html", "utf-8", null);

This line specifies the resources home / webpage origin url with abspath.substring(0, pos)+"/" this part of code.

But we did not mention it the protocol, i.e. http, ftp, file (local) so the fix was

wv.loadDataWithBaseURL("file://"+abspath.substring(0, pos)+"/", sb.toString(), "text/html", "utf-8", null);

and it worked like a charm :)

Ankit Pise
  • 1,072
  • 9
  • 27
  • My ebook with name sample_book is inside assets/epub folder. Which absolute URL do I've to use? I'm currently getting this error `Unable to open asset URL: file:///android_asset/epub/sample_book/docimages/cover.jpg` – Srikar Reddy May 04 '17 at 10:05
  • 1
    Your path doesn't seem correct, it should have begin from / of filesystem. e.g. /data/data/YOUR_PACKAGE_NAME – Ankit Pise May 06 '17 at 02:33
1

first you must get all resources like this :

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

after that you can loop the resources to get same href file

private Bitmap getBitmapFromResources(List<Resource> resources, String imgHref)
    {
        byte[] data = "holder".getBytes();
        for(int ii = 0; ii < resources.size();ii++)
        {
            String z = resources.get(ii).getHref();
            if(z.equals(imgHref))
            {
                Log.i("livi", z);
                try {
                    data = resources.get(ii).getData();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                break;
            }
        }
        //
            Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
            return bm;
    }

and this how to use that

Bitmap bm = getBitmapFromResources(resources, "cover.jpg");
            if (bm != null)
                ivTest.setImageBitmap(bm);

hope this help you.

yozawiratama
  • 3,663
  • 11
  • 50
  • 83