Как FBReader выполняет пагинацию html-файлов в epub

Я пытаюсь сделать epub-ридер

Я хочу сделать разбиение на страницы, как это делает fbreader

Теперь у меня есть исходный код fbreader, но я не знаю, где он реализует пагинацию.

У меня есть реализация других функций

Все, что мне нужно от fbreader, это нумерация страниц.

Есть ли кто-нибудь, кто делал подобное?

Спасибо за ваше время, чтобы прочитать этот вопрос.

PS: нумерация страниц состоит в том, чтобы разбить html-файл на страницы, в зависимости от размера экрана и размера шрифта, а также учитывается язык, при изменении размера шрифта также меняется номер страницы. Содержимое файла epub имеет формат html.


person Qing    schedule 17.05.2011    source источник
comment
Где исходный код fbreader? Если вы разместите ссылку на его источник, может быть, мы сможем найти часть страницы.   -  person Thunder Rabbit    schedule 23.06.2011
comment
думаю, исходный код версии Android должен быть отсюда. fbreader.org/FBReaderJ   -  person melaos    schedule 24.06.2011
comment
См. также stackoverflow. com/questions/2808652/   -  person Mark McLaren    schedule 24.06.2011


Ответы (3)


Это увлекательный код. Я хотел бы увидеть перевод оригинального студенческого проекта (но я полагаю, что оригинальный документ на русском языке). Поскольку это порт проекта C++, он местами имеет интересный стиль кодирования.

Приложение отслеживает, где вы находитесь в книге, используя курсоры абзаца (ZLTextParagraphCursor). Эта ситуация сопоставима с курсорами базы данных и разбивкой на страницы записей. За обслуживание текущей страницы и подсчет количества страниц отвечает класс ZLTextView.

Поскольку epubs являются документами с возможностью перекомпоновки и не ориентированы на страницы, на самом деле нет конкретного определения страницы - это просто зависит от того, где в документе вы ищете (абзац, слово, символ) и с какими настройками дисплея.

person Mark McLaren    schedule 24.06.2011
comment
При подсчете общего количества страниц он создает проблемы, когда есть изображения. Не могли бы вы предоставить решение для этого. - person Manisha; 17.06.2014

Как говорит Макларен, 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

Однако это настолько упрощенно, что вы могли бы также реализовать свой собственный.

person jpaugh    schedule 25.06.2011
comment
Да, но есть ли код для подсчета общего количества страниц, включая изображения? - person Manisha; 17.06.2014

Насколько я понял, он использует 3 растровых изображения: предыдущий текущий и следующий. Что они сделали, так это написали текст, который сохраняется и читается по этим трем растровым изображениям. По сравнению с тем, что вы видите вверху, они вычисляют данные абзацев о том, сколько времени занимает прокрутка, которую вы видите в другом примере. Вы можете начать обратный инжиниринг в классе пакета android.view bitmapManager. Это должно объяснить все о том, как они выполняют пейджинг.

person wesdfgfgd    schedule 06.12.2011