Search code examples
javaandroidandroid-activityebook-reader

Android : Parsing .epub file


I am creating a epub book reader app in android for my client. I am currently using FolioReader in my app, but it is not displaying images. Is there any other alternative to display .epub files in android.

Thanks in advance !


Solution

  • You have to extract images and keep a reference to those images while loading data in webview . Try this code (add epub lib and slf4j libraries)

          outPutFolder=getDir("example", Context.MODE_PRIVATE) + "/"+fileName +"/" ;
              //your directory name
    
      try {
    
            epubInputStream=new FileInputStream(filePath);
    
        } catch (IOException e1) {
    
            e1.printStackTrace();
        }
    
    
        try {
            book = (new EpubReader()).readEpub(epubInputStream);
        } catch (IOException e) {
    
            e.printStackTrace();
        }
    
        outPutFolder=getDir("example", Context.MODE_PRIVATE) + "/"+fileName +"/" ;
        setOutPutFolder(outPutFolder);
    
        DownloadResource(outPutFolder);
    
    
    
        linezNew = "";
        Spine spine = book.getSpine();
        List<SpineReference> spineList = spine.getSpineReferences() ;
        int count = spineList.size();
    
        StringBuilder string = new StringBuilder();
        for (int i = 0; count > i; i++) {
    
            Resource res = spine.getResource(i);
    
            try {
                InputStream is = res.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                try {
                    String line;
                    while ((line = reader.readLine()) != null) {
                        linezNew =   string.append(line + "\n").toString();
                    }
    
                } catch (IOException e) {e.printStackTrace();}
    
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        linezNew = linezNew.replace("../", "");
    
        finalDataToLoad="<head><style>img{max-width: 100%; width:50%; height: 50%;}</style></head> "+linezNew;
    
    
      webView.loadDataWithBaseURL("file://" + outPutFolder, finalDataToLoad, "text/html", "utf-8", null);
    

    and DownloadResource function is

        private void DownloadResource(String directory) {
        try {
    
            Resources rst = book.getResources();
            Collection<Resource> clrst = rst.getAll();
            Iterator<Resource> itr = clrst.iterator();
    
            while (itr.hasNext()) {
                Resource rs = itr.next();
    
                if ((rs.getMediaType() == MediatypeService.JPG)
                        || (rs.getMediaType() == MediatypeService.PNG)
                        || (rs.getMediaType() == MediatypeService.GIF)) {
    
                    Log.d("Href", rs.getHref());
    
                    File oppath1 = new File(directory, rs.getHref().replace("OEBPS/", ""));
    
                    oppath1.getParentFile().mkdirs();
                    oppath1.createNewFile();
    
                    System.out.println("Path : "+oppath1.getParentFile().getAbsolutePath());
    
    
                    FileOutputStream fos1 = new FileOutputStream(oppath1);
                    fos1.write(rs.getData());
                    fos1.close();
    
                } else if (rs.getMediaType() == MediatypeService.CSS) {
    
                    File oppath = new File(directory, rs.getHref());
    
                    oppath.getParentFile().mkdirs();
                    oppath.createNewFile();
    
                    FileOutputStream fos = new FileOutputStream(oppath);
                    fos.write(rs.getData());
                    fos.close();
    
                }
    
            }
    
        } catch (Exception e) {
    
        }
    }
    

    here filePath is path to your epub file ,fileName is name of your epub file which are Strings

    outPutFolder,linezNew,finalDataToLoad are also Strings