“FBReader”如何在 epub 中对 html 文件进行分页

Posted

技术标签:

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

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

我想像 fbreader 那样做分页

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

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

我需要 fbreader 的只是分页

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

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

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

【问题讨论】:

fbreader的源码在哪里?如果您发布指向其来源的链接,也许我们可以找到分页部分。 认为android版本的源代码应该来自这里。 fbreader.org/FBReaderJ 另见***.com/questions/2808652/… 【参考方案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 是可重排的文档,而不是面向页面的,因此实际上并没有具体的页面定义 - 它仅取决于您碰巧在文档中的哪个位置查看(段落、单词、字符)以及显示设置。

【讨论】:

在总页码计数中,当有图像时它会产生问题。您能否为此提供解决方案。

以上是关于“FBReader”如何在 epub 中对 html 文件进行分页的主要内容,如果未能解决你的问题,请参考以下文章

FBReader-Mupdf_library

FBReader工程结构解析

如何将kindle上的epub转mobi格式

如何在 Flutter 中显示 epub 文件的封面图片

如何使用 pandoc 包含来自 epub 模板的图像?

百科知识 epub文件如何打开