Главное > Программирование

Консольный аналог DjVu Hyperlinks Editor

(1/343) > >>

monday2000:
Я сделал консольную утилиту, выполняющую ту же работу, что и DjVu Hyperlinks Editor. Назвал её "contentm".

Скачать утилиту:

contentm

http://www.djvu-soft.narod.ru/soft/contentm.rar  (118 КБ)  (Исходники внутри)

Эта утилита принимает на входе DjVuXML-файл, созданный из ОДНОЙ DjVu-страницы с книжным оглавлением, и автоматически создаёт в копии этого DjVuXML-файла гиперссылочное оглавление. Поддерживается также сдвиг нумерации, и опциональный разделяющий символ (между номером страницы и его бессмысленным числовым префиксом).

Причины создания этой утилиты:

1. Попалась мне книга, где номер страницы имеет вид "1-1" - где первая единица - номер тома, и только вторая - номер страницы. DjVu Hyperlinks Editor не справился с таким оглавлением. Автор DjVu Hyperlinks Editor не ответил на просьбу о помощи. Вот и пришлось сделать свою аналогичную утилиту.

2. Побочный эффект: моя утилита написана на чистом С++ STL с использованием кроссплатформенной XML-библиотеки pugixml, и может скомилироваться на любой платформе.

3. Открытые исходники.

4. В дальнейшем можно будет прикрутить к утилите визуальный интерфейс.

Использование:

Вот как выглядел бы bat-файл, использующую эту утилиту:

--- Код: ---djvutoxml --page 5 --without-anno file.djvu input.xml
contentm input.xml output.xml -s - -p 1
djvuxmlparser -o file.djvu output.xml
pause
--- Конец кода ---

У нас есть DjVu-файл "file.djvu". На его 5-ой странице начинается книжное оглавление. Вытаскиваем OCR-слой с 5-ой страницы в файл input.xml (гиперссылки не извлекаем).

При помощи contentm добавляем в input.xml гиперссылки со сдвигом нумерации на 1 страницу и с разделяющим символом "-". Получаем output.xml.

Вставляем output.xml обратно в исходный DjVu-файл "file.djvu". Получаем на его 5-ой странице готовое гиперссылочное оглавление.

Ту же самую процедуру необходимо проделать для ВСЕХ страниц DjVu-файла, содержащих гиперссылочное оглавление.

DjVu Hyperlinks Editor полезная программа, но немного глючная, и не очень удобная. С английской локализацией там не всё гладко (автор сказал, что совсем не знает английский язык). Да и исходники зачем-то закрыты.

uunreal666:
Прога почему-то не создает гиперссылку на самую нижнюю строку на странице.
И можно ли сделать экспорт обработанного не только в xml, но и в dsed-файл для djvused?
Т.к. в некоторых случаях эти xml-аннотации не импортируются (размер файла растет, но аннотаций не видно и не экспортируются, и притом WinDjView начинает вылетать на таком файле), притом что djvused их импортирует нормально.

monday2000:
uunreal666

--- Цитировать ---Прога почему-то не создает гиперссылку на самую нижнюю строку на странице.
--- Конец цитаты ---
Это не удивительно, потому что вообще задача генерации гиперссылочного оглавления тяжело автоматизируется - слишком велико разнообразие случаев условия, и зачастую слишком малы "зацепки" в тексте, чтобы правильно определить - то ли это пункт оглавления, то ли просто параграф.

Давайте пример, я попробую под него подстроить прогу.

--- Цитировать ---И можно ли сделать экспорт обработанного не только в xml, но и в dsed-файл для djvused?
--- Конец цитаты ---
По идее можно, но мне это не интересно, по крайней мере пока. Мне кажется, что XML более удобен и популярен, нежели чем формат dsed-файлов (Lisp)

--- Цитировать ---Т.к. в некоторых случаях эти xml-аннотации не импортируются (размер файла растет, но аннотаций не видно и не экспортируются, и притом WinDjView начинает вылетать на таком файле)
--- Конец цитаты ---
Это, скорее всего, значит, что djvuxml имеет какой-то глюк - который нужно найти и устранить. В таких случаях присылайте мне образец проблемного файла - буду с ним разбираться.

ivt:

--- Цитировать ---Прога почему-то не создает гиперссылку на самую нижнюю строку на странице.
--- Конец цитаты ---
Показал исходники знакомому программисту, объяснил суть задачи. Он сказал что проблема здесь (файл contentm.cpp):

--- Код: ---for (int j=0; j<lines.size()-1; j++)
--- Конец кода ---
нужно заменить на

--- Код: ---for (int j=0; j<lines.size(); j++)
--- Конец кода ---
или

--- Код: ---for (int j=0; j<=lines.size()-1; j++)
--- Конец кода ---
Суть думаю понятна: в исходном варианте последняя линия просто не попадала в цикл обработки. Исправление же расширяют границы цикла чтобы он охватывал все линии  (от 0 до lines.size()-1 включительно).
Пробовал собрать с исправлениями  в QtCreatore, собралось, работает вроде правильно (проверял на этих файлах).

Также заметил еще одну особенность: если строка в содержании располагается на двух линиях, то гиперссылка будет сформирована только для второй линии (где встречается номер страницы). В примере, на котором я проверял, такие строки тоже есть. Также такие строки есть в этой книге.

Cromosnub:
Вы абсолютно правы. В этом что-то есть и это отличная идея. Готов Вас поддержать.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии