“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 文件进行分页的主要内容,如果未能解决你的问题,请参考以下文章