如何根据屏幕尺寸将Epub Html拆分为页面

2024-02-20

我正在开发一个读取电子书(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);

}

因此,正如您所看到的,我在网络视图中显示电子书,据我所知,网络视图提供的唯一滚动可能性是向上/向下。

我正在考虑将 getData() 返回的 html 字符串和 webview 加载到页面中并使用 viewpager 将它们一一显示,但是如何根据屏幕尺寸正确拆分 html?

你认为我的这个想法是对的吗?还有其他解决方案可以从左到右/从右到左(分页)显示 epub 或任何其他“免费或便宜”的库吗? (我尝试了PageTurner,它确实很好,但商业版对我来说太贵了)


我在android中做了这样的分页效果..

-> 创建自定义 webview 类。
-> 设置下面的客户端并加载 url,然后您将获得带有页数的水平滚动。
-> 锁定 webview 默认滚动。
->为了平滑的分页效果而不是移动webview的滚动,移动整个webview,这样一页就有一个webview。
-> 使用您自己的视图翻转器来缓冲上一页和下一页。


我已经完成了所有这些实现,并且为一个组织制作了一个产品。我只是分享我的想法如何实现最佳解决方案。不要使用第三方并由于该 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();
    }

您加载网址的一个

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据屏幕尺寸将Epub Html拆分为页面 的相关文章

随机推荐

  • LWJGL 3.2.0+ 字体

    我使用 lwjgl 一段时间了 最 近我决定从固定功能管道切换到着色器 因此 当我启动程序时 我首先设置 ContextAttrib 3 2 这样我将使用 GL 3 2 问题是 当我打开更高版本的 GL 时 很多功能都不受支持 在切换到更高
  • Python:使用图表创建 Excel 工作表

    是否有任何模块可以在 Python 中创建带有嵌入图表的 Excel 图表 这个问题中提到的模块 https stackoverflow com questions 553019 python excel making reports好像没
  • 使用 CMake 设置应用程序图标

    有没有跨平台的方法来使用 CMake 设置应用程序图标 我正在使用 Cmake 3 0 2 和 Qt 5 4 在Qt中文档 http doc qt io qt 5 appicon html显示了一种方法 但它不是跨平台的 CMake 不会为
  • Heroku 上 React 应用程序的简单密码保护

    我有一个简单的 React 应用程序 是用 create react app 创建的 我想将其部署到 Heroku 或简单的地方 并进行密码保护 保护可以非常简单 只需一个密码就可以了 我开始研究 HTTP 基本身份验证 但没有找到简单的答
  • 为什么 PathPrefixStrip 可以工作而 PathPrefix 不能?

    我有一个 GatsbyJS 静态站点 prefix paths The pathPrefix被设定为 environment test in gatsby config js 它被部署到运行 Traefik 的 docker swarm 中
  • 本地目录路径

    一个相当简单的问题 如何找到我的exe所在的本地目录的路径 就像我有一个 exe 一样 在程序中我必须在 exe 所在的目录中创建一个 txt 文件 语言 C 因此 如果 exe 位于 C Temp 并从那里启动 我的 txt 应该在 C
  • 使用 R 删除列表中空的零长度行

    我有数据框列表 有些是空的 如何删除它们 S566X7221 1 V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24
  • 如何从 Google Colab 访问我的 Google 云端硬盘文件?

    我使用以下网址从网址下载了图像urlretrieve urllib 在 Google Colab 中 但是 下载图像后 我无法找到图像 from google colab import drive drive mount content g
  • Vaadin:如何显示 MySQL 数据库中的数据?

    我正在开发 Vaadin Flow 版本 14 1 应用程序 但遇到了这个问题 我无法将其直接与 MySQL 数据库连接 我已经与 Maven 设置了 JDBC 连接 还创建了一个名为 Datasource 的单例类 在其中存储我的值和方法
  • 如何使用VBA在Excel中的所有行前面添加单引号

    我有一个电子表格 其中包含带有日期的第一列 我希望文本保留为 May 21 但采用字符串形式 单元格值应该是 May 21 但是当我尝试将其转换为字符串时 它使用 5 位数字 如果我将列保留为日期格式 它会首先自动选择 May 因此即使格式
  • 用于特定文本模式的 PHP 正则表达式

    在我的网站上 我在正文中插入了项目创建的年份 并将其替换为 六年前 或者无论有多长 所以在我的内容中我有 我们自 1998 年开始营业 并在 2011 年前制作了这种包装设计 我试图使用正则表达式将 2011 放入变量中以便稍后搜索和替换
  • 复制矩阵的一行或一列并将其插入到下一行/列中

    我想知道 MATLAB 中是否有一种简单的方法来执行以下操作 我想复制矩阵的行或列并将其插入到下一行 列中 例如 给定一个 3x3 矩阵 1 2 3 4 5 6 7 8 9 我想复制第一行并将其作为第二行插入 1 2 3 1 2 3 4 5
  • 提取模式两端由标识符括起来的多行

    我正在尝试从日志文件中提取特定事件的跟踪 为了查找相关事件 我查找 PATTERN 为了提取事件的完整跟踪 我希望提取由 SEPARATOR 包围的模式两端的行 例如 如果日志文件的内容是 Line1 Line2 SEP Line3 Lin
  • C# 显示隐藏窗口

    我正在开发一个 Excel 插件 在某些时候 我可以接收异步事件 如果 Excel 窗口在这些事件上隐藏 我需要能够显示该窗口 我能够存储Hwnd属性 我相信它必须是一个不可变的 int 引用来标识我的 Excel 窗口 有人可以详细说明这
  • 在 Php 中连接两个表[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有两张桌子 表1 类别 Id na
  • XML 架构中的数字 ID 类型

    我需要使用 XML 模式定义具有给定模式的 ID 类型 到目前为止我所拥有的是这样的
  • 将 LaTeX 表格直接打印到图像(PNG 或其他)

    有没有办法从 R 中将 LaTeX 表格直接打印到图像文件 以包含在另一个文档 网页中 基本上 我想向一个函数提供 LaTeX 代码 该函数将其作为图像保存到工作目录中 白日梦 有各种 LaTeX 到图像转换器脚本 旨在执行诸如将方程转换为
  • 将 tcp_max_tw_buckets 设置为非常小的值有什么副作用?

    我知道将 tcp max tw buckets 设置为相对较小的数字 例如 30000 或 50000 是很正常的 以避免主机有大量时间等待状态连接并且应用程序无法打开新连接的情况 这是被提及很多次的事情 比如这样的问题 如何减少TIME
  • NodeJS - 来自 app.js 的第三方 Api 调用

    我需要从 NodeJS 后端调用第 3 方 api 并将数据返回到前端的 ajax 调用 下面是我的代码 router post get data function request response var city name reques
  • 如何根据屏幕尺寸将Epub Html拆分为页面

    我正在开发一个读取电子书 epub 格式 的 Android 应用程序 目前我正在使用 Paul Siegeman 的 epublib 库 它确实是一个非常好的 epub 阅读器 但它有一些限制 例如我需要的 你无法水平移动页面 就像阅读一