如何根据屏幕尺寸将Epub Html分割成页面

13

我正在开发一款可以阅读epub格式电子书的Android应用程序,目前我正在使用Paul Siegeman的epublib库,它是一个非常优秀的epub阅读器但它有一些限制,例如我需要的那个功能,你不能像读实体书一样水平翻页,因此我需要自己实现这个功能,但我卡住了。

实际读取epub并将其放入webview的方法如下:

private void openEpub(String bookFilename){

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

    nl.siegmann.epublib.domain.Book book=null;
    try {
        book = (new EpubReader()).readEpub(new FileInputStream(Environment.getExternalStorageDirectory().getPath() + "/" + bookFilename));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    String baseUrl = Environment.getExternalStorageDirectory().getPath() + "/";
    String data=null;
    try {
        data = new String(book.getContents().get(1).getData());
    } catch (IOException e) {
        e.printStackTrace();
    }
    webView.loadDataWithBaseURL(baseUrl, data, "text/html", "UTF-8", null);

}

所以您可以看到,我在Webview中显示电子书,据我所知,Webview提供的唯一滚动可能性是上下滚动。

我考虑将getData()返回并由Webview加载的html字符串拆分为多个页面,并通过ViewPager逐个显示它们,但如何根据屏幕大小正确地拆分html呢?

您认为这个想法可行吗?有没有其他方法可以从左到右/从右到左(分页)显示epub或任何其他“免费或便宜”的库可以做到这一点? (我尝试了PageTurner,它非常好,但商业版本对我来说太贵了)

3个回答

14

我在Android上实现了分页效果,具体步骤如下:
-> 创建一个自定义WebView类。
-> 设置以下客户端并加载URL,您将获得带有页面计数的水平滚动。
-> 锁定WebView默认滚动条。
-> 为了实现平滑分页效果,应该移动整个WebView而不是移动WebView的滚动条,因此每一页都应该有一个WebView。
-> 使用自己的ViewFlipper缓存前一页和后一页。


我已经实现了所有这些功能,并为组织制作了一个产品。我只是分享我的想法,如何朝最佳解决方案的方向去思考。与其使用第三方库,然后由于该SDK的限制而被卡住,还不如将一切都自己实现。

private class MyWebClient extends WebViewClient
    {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {

            super.onPageStarted(view, url, favicon);
        }
        @Override
        public void onPageFinished(WebView view, String url) 
        {
            super.onPageFinished(view, url);

            final MyWebView myWebView = (MyWebView) view;


                String varMySheet = "var mySheet = document.styleSheets[0];";

                String addCSSRule = "function addCSSRule(selector, newRule) {"
                        + "ruleIndex = mySheet.cssRules.length;"
                        + "mySheet.insertRule(selector + '{' + newRule + ';}', ruleIndex);"

                        + "}";

                String insertRule1 = "addCSSRule('html', 'padding: 0px; height: "
                        + (myWebView.getMeasuredHeight()/getContext().getResources().getDisplayMetrics().density )
                        + "px; -webkit-column-gap: 0px; -webkit-column-width: "
                        + myWebView.getMeasuredWidth() + "px;')";



                myWebView.loadUrl("javascript:" + varMySheet);
                myWebView.loadUrl("javascript:" + addCSSRule);
                myWebView.loadUrl("javascript:" + insertRule1);




        }
    }

    private class MyWebChromeClient extends WebChromeClient
    {
        @Override
        public void onProgressChanged(WebView view, int newProgress) 
        {
            super.onProgressChanged(view, newProgress);

            if(newProgress == 100)
            {
                postDelayed(new Runnable() 
                {
                    @Override
                    public void run() 
                    {
                        calculateNoOfPages();
                    }       

                },200);
            }
        }
    }
private void calculateNoOfPages()
    {
        if(GlobalSettings.EPUB_LAYOUT_TYPE == GlobalConstants.FIXED)
        {

        }
        else
        {
            if(getMeasuredWidth() != 0)
            {
                int newPageCount = computeHorizontalScrollRange()/getMeasuredWidth();
                getData().getChapterVO().setPageCount(newPageCount);

            }
        }
    }
@Override
    public int computeHorizontalScrollRange() {
        // TODO Auto-generated method stub
        return super.computeHorizontalScrollRange();
    }

当你加载网址时


1
感谢您的评论,arunavh!如果需要进一步帮助,欢迎随时联系 :) - Uday Sravan K
非常感谢您抽出宝贵时间,Uday。我会尽快尝试一下,但您认为您的解决方案容易实现吗?(我只是在办公室匆匆浏览了一下) - Diego Perez
已经将此功能集成,并在WebView中实现了水平滚动,现在我可以横向阅读书籍。但是请问一下,我该如何为每个新页面集成ViewFlipper? - Rahul Upadhyay
不要使用Android ViewFlipper API。制作一个自定义的ViewFlipper,它将根据滑动手势提供页面。滑动手势也应该通过重写视图的onTouchEvent来完成,而不是直接使用手势监听器。扩展基本的View类并开始工作,一切都在你的掌控之中。 - Uday Sravan K
不太好的想法,有时候一行代码会从中间被截断。就像字符的下半部分离开了屏幕。 - Masoud Dadashi
显示剩余3条评论

3

请关注这个 GitHub 账户。

FbReader 提供了一些出色的 epub 和 pdf 阅读器库。尝试一下....

或者

你可以通过扩展 WebView 来制作你自己的 自定义 WebView。在这里,你可以放置和修改你想要的所有 WebView 功能。

我的同事使用 FbReader 制作了一个阅读器,效果非常好。


非常感谢你,Jatin。最终,在找不到解决方案的情况下,由于这是一个重要的项目,我决定购买一款阅读器。现在我正在使用Page Turner Reader,虽然它不是免费的,但它是一个非常棒的应用程序。 - Diego Perez

1

嘿,我认为这会对你有所帮助。Nacho L的回答对我有用。这里有一个类似书籍的分页HTML book-like pagination


非常感谢atihska,就像我在下面对Jatin说的那样,在没有找到解决方案的情况下,我决定购买一个阅读器,现在我正在使用Page Turner阅读器,它不是免费的,但它是一个非常棒的应用程序。 - Diego Perez
@Atishka,我测试了你的建议,它有效。我不擅长js,所以你能告诉我如何通过点击或滚动来切换页面吗?一个提示将不胜感激。 - Masoud Dadashi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接