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

Консольное создание DjVu-оглавления

(1/405) > >>

monday2000:
Я сделал консольную утилиту для облегчения создания DjVu-букмарков. Назвал её "bookm".

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

bookm

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

Эта утилита принимает на входе табулированный текстовый файл, т.е. такой, где в начале каждой строки стоят один или несколько Tab-символов, обозначающие иерархию вложенности строк будущего оглавления.

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

--- Цитировать ---Line1 1
   Line2 2
   Line3 3
   Line4 4
      Line5 5
      Line6 6
      Line7 7
Line8 8
Line9 9
--- Конец цитаты ---

Утилита bookm преобразует такой файл в формат букмарков, непосредственно понятный djvused. Т.е. можно вручную подготовить файл букмарков, и при помощи bookm создать букмарки в DjVu. Мне понравилось использовать для ручного создания табулированного файла текстовый редактор Notepad++ - потому что там можно оптом (выделив мышью) сдвигать несколько строк текста табом.

Теперь о том, зачем я это сделал (т.е. утилиту bookm):

Как известно, таких программ имеется уже несколько, которые умеют создавать DjVu-букмарки из ничего, причём многие такие программы - визуальные. Зачем же я тогда сделал ещё одну, да ещё консольную?

Причин тому несколько:

1. Мне не нравится привязка большинства похожих программ к .NET. Моя утилита написана просто на чистом С++ STL, и может скомилироваться на любой платформе.

2. Бывают изредка столь заковыристые оглавления, что ни одна из существующих программ не предусматривает работу с ними. Например, мне попалась книга, где номер страницы имеет вид "1-1" - где первая единица - номер тома, и только вторая - номер страницы. В этом случае проще поправить исходник и перекомпилировать утилиту заново, чем страдать от невозможности простой вставки букмарков.

3. Не все аналогичные утилиты имеют открытые исходники.

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

Раньше я пользовался для вставки DjVu-букмарков китайской утилитой PdgCntEditor. Но в последний раз она что-то не поняла кодировки моего файла. Пришлось делать свою утилиту.

bookm ещё предусматривает опцию прибавления некоего заданного числа ко всем номерам страниц (считываемых из табулированного файла). Это удобно для DjVu-книг, имеющих обложку - там идёт сдвиг нумерации всего оглавления на 1.

57an:

--- Цитировать ---В конце каждой строки должна стоять цифра, обозначающая номер строки
--- Конец цитаты ---
Видимо, имелось в виду "страницы".


--- Цитировать ---В этом случае проще поправить исходник и перекомпилировать утилиту заново
--- Конец цитаты ---
Ну этим точно никто заниматься не будет. Я такие оглавления в Excele приводил к линейной нумерации. Да и то потом плевался, подгоняя страницы (потому что это был pdf, а Pdf-функционала в Букмаркере тогда еще не было).

Кстати, об опен-сорсе - DjvuOutline развить разве не проще было? Прога в принципе небезуспешная, 1000 скачек за год.

Но все-таки, по-моему, лучше бы Вы "оконсолили" Djvu Imager. Там уже вся цепочка готова, даже в СТ есть подержка командной строки. Но вот в Djvu Imager обязательно придется тыкать мышкой...

monday2000:
57an

--- Цитировать ---Видимо, имелось в виду "страницы".
--- Конец цитаты ---
Да, точно. :)

--- Цитировать ---Ну этим точно никто заниматься не будет.
--- Конец цитаты ---
Из пользователей - да, а из тех, кто программирует - может кто-то и найдётся. Там всего лишь одну функцию подправить - всё там понятно. Или же я сам оперативно поправлю по чьей-нибудь просьбе.

--- Цитировать ---Кстати, об опен-сорсе - DjvuOutline развить разве не проще было?
--- Конец цитаты ---
Там сложно ковыряться, там код довольно навороченный мне показался. Я старался как можно попроще код сделать.

--- Цитировать ---Но все-таки, по-моему, лучше бы Вы "оконсолили" Djvu Imager.
--- Конец цитаты ---
Да я, собственно, наоборот старался уйти там от консольных приложений - чтобы облегчить жизнь пользователю. :) А вообще, главный управляющий код в DjVu Imager настолько примитивен, что мне даже в голову не пришло делать для него отдельное консольное приложение.

Принцип работы DjVu Imager расписан тут:
http://www.djvu-soft.narod.ru/scan/back_glue.htm
http://www.djvu-soft.narod.ru/scan/mask_color.htm

На основании этих 2 статей можно элементарно написать какой-нибудь скрипт, управляющий консольными утилитами а-ля DjVu Imager. То есть, для общественности принцип работы DjVu Imager вовсе не потерян и не скрыт. Как раз по этим статьям легче будет разобраться, чем если бы я сделал управляющее консольное приложение.

DjVu Imager - это, конечно, не навсегда. Но замена DjVu Imager должна быть ИМХО визуальной - т.е. с выводом изображения кодируемых страниц до и после кодирования. Т.е. это должно быть нечто внешне похожее на СТ, только работающее аналогично DjVu Imager.

m7876:
Вы не подскажете, как Вашу программу скомпилировать под gcc/g++?
Сначала были такие ошибки:
===
$gcc bookm.cpp -o bookm
bookm.cpp: In function ‘int get_line_info(std::string&, std::string&)’:
bookm.cpp:75: error: ‘atoi’ was not declared in this scope
bookm.cpp: In function ‘int put_line(std::ifstream&, std::ofstream&, std::string)’:
bookm.cpp:156: error: ‘itoa’ was not declared in this scope
bookm.cpp: In function ‘int main(int, char**)’:
bookm.cpp:236: error: ‘atoi’ was not declared in this scope
===
Потом я (следуя советам отсюда http://www.velocityreviews.com/forums/t285100-itoa-function-in-gcc.html) вставил ссылку на библиотеку (#include <stdlib.h>) и заменил itoa() на sprintf(), появилась такая ошибка:
===
$ gcc bookm.cpp -o bookm
bookm.cpp: In function ‘int put_line(std::ifstream&, std::ofstream&, std::string)’:
bookm.cpp:158: error: invalid conversion from ‘int’ to ‘char*’
bookm.cpp:158: error:   initializing argument 1 of ‘int sprintf(char*, const char*, ...)’
===

nbl:
Покажите что у Вас получилось после замены itoa на sprintf.

Я бы заменил строку itoa(page_num + page_shift,buf,10); на sprintf(buf, "%d", page_num + page_shift);

Навигация

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

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

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