Как разделить Epub Html на страницы в зависимости от размера экрана

Я разрабатываю приложение для Android, которое читает электронные книги (в формате epub), и на данный момент я использую epublib-библиотеку Пола Сигемана, которая действительно очень хороший читатель, но у него есть некоторые ограничения, например, и тот, который я нужно, вы не можете перемещаться по страницам горизонтально (так как вы читаете настоящую книгу), поэтому мне нужна моя реализация, но я застрял.

Метод, который на самом деле читает 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 дает вверх/вниз.

Я думал о разделении строки html, возвращаемой getData(), и веб-просмотр загружается на страницы и отображает их один за другим с помощью viewpager, но как правильно разбить html в соответствии с размером экрана?

С вашей идеей вы думаете, что я на правильном пути? Любые другие решения для отображения epub слева направо/справа налево (paginate) или любая другая "бесплатная или дешевая" библиотека для этого? (Я попробовал PageTurner, это действительно хорошо, но коммерческая версия слишком дорога для меня)

Ответ 1

Я сделал pagination эффект в android, как это..

- > создать пользовательский класс webview.
- > установить ниже клиентов и загрузить URL-адрес, тогда вы получите горизонтальную прокрутку со списком страниц.
- > Заблокировать прокрутку по умолчанию webview.
- > Для гладкого эффекта разбивки на страницы вместо перемещения прокрутки веб-просмотра перемещайте весь веб-просмотр, поэтому для одной страницы будет один веб-просмотр.
- > Используйте свои собственные viewflippers для буферизации предыдущих и следующих страниц.


Я сделал все эти реализации, и я сделал продукт для организации. Просто я делюсь своей идеей, как подойти к лучшему решению. Вместо использования третьих паритетов и застревания в середине из-за ограничения этого 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();
    }

вы загружаете URL-адрес

Ответ 2

Следуйте этому github.

FbReader предоставляет отличные библиотеки для чтения epub и pdf. Попробуйте это....

или

Вы можете создать собственный пользовательский WebView, расширив WebView. Здесь вы можете размещать и изменять все функции, которые вы хотите использовать в своем WebView.

Мой коллега сделал читателя, используя этот FbReader, и это было потрясающе.