【问题标题】:How the "FBReader" do the pagination of html files in epub“FBReader”如何在 epub 中对 html 文件进行分页
【发布时间】:2011-08-27 00:22:21
【问题描述】:

我正在尝试制作一个 epub 阅读器

我想像 fbreader 那样做分页

现在我有了fbreader的源码,但不知道它在哪里实现分页

我在其他功能上有我的实现

我需要 fbreader 的只是分页

有没有人做过类似的事情?

感谢您抽出宝贵时间阅读此问题。

ps:分页是将html文件分页,取决于屏幕大小和字体大小,语言也考虑在内,当字体大小改变时,页码也会改变。而epub文件内容为html格式

【问题讨论】:

标签: android html pagination epub


【解决方案1】:

我的理解是它使用了 3 个位图,当前和下一个。他们所做的是编写了一个文本,该文本通过这 3 个位图进行存储和读取。正如您在顶部看到的那样,他们计算您在其他示例中看到的滚动长度的段落数据。您可以在 android.view 包类 bitmapManager 开始逆向工程。这应该可以解释他们如何进行分页的所有内容。

【讨论】:

    【解决方案2】:

    正如 McLaren 所说,FBReader实现分页:它使用 ZLibrary,它可以从与 FBReader 相同的website 获得。

    原始代码使用这个来计算当前页码:

    size_t ZLTextView::pageNumber() const {
        if (textArea().isEmpty()) {
            return 0;
        }
        std::vector<size_t>::const_iterator i = nextBreakIterator();
        const size_t startIndex = (i != myTextBreaks.begin()) ? *(i - 1) : 0;
        const size_t endIndex = (i != myTextBreaks.end()) ? *i : 
                textArea().model()->paragraphsNumber();
        return (myTextSize[endIndex] - myTextSize[startIndex]) / 2048 + 1;
    }
    

    Java版使用该函数计算页码:

    private synchronized int computeTextPageNumber(int textSize) {
        if (myModel == null || myModel.getParagraphsNumber() == 0) {
            return 1;
        }
    
        final float factor = 1.0f / computeCharsPerPage();
        final float pages = textSize * factor;
        return Math.max((int)(pages + 1.0f - 0.5f * factor), 1);
    }
    

    位于org.geometerplus.zlibrary.text.view.TextView

    不过,它太简单了,您不妨实现自己的。

    【讨论】:

    • 是的,但是有没有代码可以计算包括图片在内的总页数
    【解决方案3】:

    这是令人着迷的代码。我很想看到原始学生项目的翻译(但我认为原始文件是俄文的)。由于这是一个 C++ 项目的移植版,因此它在某些地方有一种有趣的编码风格。

    该应用程序通过使用段落光标 (ZLTextParagraphCursor) 来跟踪您在书中的位置。这种情况与数据库游标和记录分页比较。负责提供当前页面和计算页面数量的类是ZLTextView

    由于 epubs 是可重排的文档,而不是面向页面的,因此实际上并没有具体的页面定义 - 它仅取决于您碰巧在文档中的哪个位置查看(段落、单词、字符)以及显示设置。

    【讨论】:

    • 在总页码计数中,当有图像时它会产生问题。您能否为此提供解决方案。
    猜你喜欢
    • 2012-02-06
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2012-12-19
    • 2011-08-07
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多