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

时间:2011-05-17 07:14:10

标签: android html pagination epub

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

我想像fbreader那样进行分页

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

我有其他功能的实现

我需要的所有fbreader都是分页

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

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

ps:分页是将html文件吐出到页面,具体取决于屏幕的大小和字体的大小,并且语言也在考虑中,当改变字体大小时,页码也会改变。而epub文件内容是html格式

3 个答案:

答案 0 :(得分:4)

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

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

由于 epubs 是可重排文档而不是面向页面的,因此页面并没有真正的具体定义 - 它只取决于您在文档中的位置(段落,单词,字符)以及显示设置。

答案 1 :(得分:4)

正如迈凯轮所说,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

但是,如此简单,你也可以实现自己的。

答案 2 :(得分:2)

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