"FBReader"如何对epub中的html文件进行分页?

19

我正在制作一款epub阅读器

我希望像fbreader一样进行分页

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

除了分页,我已经完成了其他功能的实现

我只需要从fbreader获取分页部分的代码

是否有人做过类似的事情?

感谢您抽出时间来阅读这个问题。

附注:分页是将html文件根据屏幕大小、字体大小和语言等考虑因素拆分成页面。当更改字体大小时,页面数也会相应更改。而epub文件内容是以html格式呈现的。


2
FBReader的源代码在哪里?如果您发布其源代码的链接,也许我们可以找到分页部分。 - Thunder Rabbit
认为Android版本的源代码应该从这里获取。http://www.fbreader.org/FBReaderJ/ - melaos
2
请参见https://dev59.com/nnE85IYBdhLWcg3wYSVk。 - Mark McLaren
3个回答

4
如麦克拉伦所说,FBReader没有实现分页功能:它使用的是ZLibrary,该库可以从与FBReader相同的网站获取。
原始代码使用此功能来计算当前页码:
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中。
不过它非常简单,你可能会想要自己实现。

是的,但有没有任何代码可以计算包括图像在内的总页数? - Manisha

4
这是一段非常有趣的代码。我很想看到原始学生项目的翻译(但我认为原始文档是俄语)。由于这是C++项目的移植,因此在某些地方它具有有趣的编码风格。
该应用程序使用段落光标(ZLTextParagraphCursor)跟踪您在书中的位置。这种情况类似于数据库光标和记录分页。负责提供当前页面并计算页面数量的类是ZLTextView
由于epub是可重排文档而不是面向页面的文档,因此没有一个具体的页面定义 - 它取决于您正在查看文档的位置(段落、单词、字符)以及显示设置。

在总页数计算中,当存在图片时会出现问题。您能否提供解决方案? - Manisha

2
我理解的方式是它使用三个位图——前一个、当前和下一个。他们编写了一段文本,该文本在这三个位图上存储和读取。就像您在顶部看到的内容,他们计算出了段落数据,以确定滚动条在其他示例中的长度。您可以从android.view包类bitmapManager开始进行反向工程。这应该能解释他们如何进行分页的所有细节。

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