Автор Тема: Создание оглавления в djvu  (Прочитано 51038 раз)

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: Создание оглавления в djvu
« Ответ #15 : 18 ПЭТРам 2010, 12:29:14 »
Vadik789
Цитировать
Я думаю, можно, но имеет ли смысл? Программа не такая уж сложная.
Обязательно, обязательно нужно. И желательно, напишите там "лицензия GPL 2 или выше" - как в WinDjView и DjVuLibre. И версии программы обязательно пишите в дистрибутивах - а то народ будет возмущаться, это уже проверено. :)

Кстати - а программа так и будет назваться "djvuoutline"? Дело, конечно, хозяйское, но как насчёт "DjVu Outline"? Так оно, ИМХО, красивше... ;) Ну, или хотя бы, с большой буквы. Но это, как хотите.

Леон Боту сделал нужное исправление в djvused. Вот, забирайте готовый экзешник:

http://www.djvu-soft.narod.ru/soft/djvused.rar (258 КБ)

Цитировать
               DJVUSED

Эта версия djvused была взята из CVS DjVuLibre

http://djvu.cvs.sourceforge.net/viewvc/djvu/djvulibre-3.5/tools/djvused.cpp?view=log

Конкретно это Revision 1.37 версии djvused.

Она впервые правильно поддерживает кириллические имена DjVu-файлов,

подаваемые на вход её командной строки не в Юникоде, а в DOS-кодировке.


В отличие от djvused из DjVuLibre 3.5.22, эта версия djvused:

1. Не зависит ни от каких специфических dll-библиотек.

2. Работает под Windows 98.

_____________________

Скомпилировал monday2000 в MS VC++ 6.0

18.01.2010

http://www.djvu-soft.narod.ru
По идее, этот билд djvused должен быть идентичен по поведению официальному билду djvused из DjVuLibre 3.5.22.

Но возникает вопрос: а как же прежние версии djvused нормально работали с кириллицей в таких программах, как DjVuOCR 2 и DjVu Hyperlinks Editor? По-видимому, djvused может принимать на входе и Юникод - вот только я пока не смог заставить её работать через Юникод...

И сам Леон написал в CVS http://djvu.cvs.sourceforge.net/viewvc/djvu/djvulibre-3.5/tools/djvused.cpp?view=log :
Цитировать
Solved problem opening file names with non utf8 encoding.
Спрошу у него.
« Последнее редактирование: 18 ПЭТРам 2010, 12:49:36 от monday2000 »

57an

  • Постоялец
  • ***
  • Сообщений: 201
    • Просмотр профиля
    • Djvu Bookmarker on SF.net
Re: Создание оглавления в djvu
« Ответ #16 : 18 ПЭТРам 2010, 15:31:21 »
Цитировать
Но возникает вопрос: а как же прежние версии djvused нормально работали с кириллицей в таких программах, как DjVuOCR 2 и DjVu Hyperlinks Editor?
Я в Djvu Bookmarker с этой проблемой столкнулся в следующем ракурсе - если в пути к обрабатываемом djvused файле не было русских букв, а в имени djvu-файла они были, то при записи, например, букмарков, программа портила имя файла. Решение было, например, таким: переименовывать djvu-файл до и после обработки, чтобы djvused обрабатывал файл не имеющий русских букв в названии.

Vadik789

  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
    • E-mail
Re: Создание оглавления в djvu
« Ответ #17 : 18 ПЭТРам 2010, 15:49:24 »
Большое спасибо за новый djvused, теперь все работает.
Цитировать
Solved problem opening file names with non utf8 encoding.
Из этого следует, что можно как-то открывать файлы с названиями в Юникоде? Скажем, если создать файл, в котором вперемешку греческие и русские буквы: εγлχщος.djvu
« Последнее редактирование: 18 ПЭТРам 2010, 15:55:06 от Vadik789 »

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: Создание оглавления в djvu
« Ответ #18 : 18 ПЭТРам 2010, 16:47:59 »
57an
Цитировать
Решение было, например, таким:
Попробуйте "мой" новый djvused - возможно, проблема уже не возникнет.
Цитировать
если в пути к обрабатываемом djvused файле не было русских букв, а в имени djvu-файла они были
Правильно, DjVuLibre с самого начала отделяет путь от имени файла - и, по-видимому, работает раздельно с ними. По крайней мере, djvused ругался именно на имя - без пути. Можно увидеть соотв. функции - в GURL.h.

Но "мой" новый djvused правильно работает с кириллицей как в пути к файлу, так и с кириллицей в самом имени файла - я только что проверил.
Vadik789
Цитировать
Из этого следует, что можно как-то открывать файлы с названиями в Юникоде?
Пока ещё не знаю - подождём ответа Леона. Конечно, это было бы классно.

57an

  • Постоялец
  • ***
  • Сообщений: 201
    • Просмотр профиля
    • Djvu Bookmarker on SF.net
Re: Создание оглавления в djvu
« Ответ #19 : 18 ПЭТРам 2010, 19:51:05 »
Цитировать
Попробуйте "мой" новый djvused
Действительно, с русскими буквами стало получше. Но я использую, к примеру, также и ddjvu для просмотра djvu-файлов. А она тянет за собою те самые dll-ки, которые уже внедрены в "ваш" djvused... (и еще графические). И, если внедрить эти dll в ddjvu, то суммарный размер, скорее всего получится большим, чем у исходных djvused, ddjvu плюс dll. Видимо, поэтому DjvuLibr'овцы и решили остаться на пути "много мелких exe" + несколько основных dll...

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: Создание оглавления в djvu
« Ответ #20 : 19 ПЭТРам 2010, 09:16:22 »
57an
Цитировать
Видимо, поэтому DjvuLibr'овцы и решили остаться на пути "много мелких exe" + несколько основных dll...
Это одна из причин. Вторая - это наибольшая унификация, т.е. ядро - в dll, а высокоуровневая работа - в консольных утилитах.
Но минус их подхода в том, что, если мне нужно использовать лишь одну консольную утилиту - я всё равно должен приложить к ней все dll-либы из DjVuLibre - а это уже будет заметно больше по размеру, чем одна dll-независимая консольная утилита.
Просто они как-то неправильно всё сделали. Им нужна почему-то целая куча этих dll, да ещё и manifest какой-то. Сделали бы они лишь 1 dll - а не кучу - тогда было бы удобно, а сейчас эта россыпь dll - как-то напрягает.
Vadik789
Пришёл ответ от Леона Боту:
(Он же написал в CVS о djvused
Цитировать
Solved problem opening file names with non utf8 encoding.
)
Цитировать
Utf8 is not the same as unicode.
Unicode defines an integer per character but does not say how to encode the integer.
Utf8 is a multi-byte encoding for unicode widely used under unix.
Windows uses a 16 bit encoding for unicode that is sometimes called utf16.

All the djvulibre tools use the good old stdio functions based on 8 bit strings.
Modern unix machines use utf8 multi-byte encoding, therefore the stdio functions can deal with unicode.
But the windows console is stuck with the legacy multi byte code pages
In that respect they work like a unix machine with a non-utf8 locale.
См. http://ru.wikipedia.org/wiki/UTF8

http://webmastak.com/article.aspx?id=300
« Последнее редактирование: 19 ПЭТРам 2010, 09:20:20 от monday2000 »

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: Создание оглавления в djvu
« Ответ #21 : 19 ПЭТРам 2010, 11:25:45 »
Ничего у меня не получается с UTF-8. :( Я сделал bat-file в кодировке "UTF-8 без BOM" (как и положено) - из ASCII-txt-файла путём сохранения его в программе AkelPad (единственное, что я нашёл; NotePad++ некорректно сохраняет) в bat-file. Пишет следующее:
Цитировать
D:\djvulibre\tools\Release\проба моя>djvused "D:\djvulibre\tools\R
elease\╨┐╤А╨╛╨▒╨░ ╨╝╨╛╤П\╤Д╨░╨╣╨╗.djvu" -e "set-outline content" -s
*** ** Unrecognized DjVu Message:
        ** Message name:  ♥ByteStream.open_fail
           Parameter: T%C4%A6-%A6%A6%A6%AC.djvu
           Parameter: No such file or directory
*** (C:\d\libdjvu\ByteStream.cpp:728)


D:\djvulibre-3.5.17\tools\Release\проба моя>pause
Для продолжения нажмите любую клавишу . . .
Написал опять письмо Леону. В общем, не знаю я, как использовать UTF-8.  :(

57an

  • Постоялец
  • ***
  • Сообщений: 201
    • Просмотр профиля
    • Djvu Bookmarker on SF.net
Re: Создание оглавления в djvu
« Ответ #22 : 19 ПЭТРам 2010, 12:21:59 »
Цитировать
путём сохранения его в программе AkelPad
Попробуйте notepad2. Очень умна в плане кодировок.

А неизвестно, когда DjvuLibre выпустят очередную подверсию с "правильным" djvused? Я бы все-таки хотел оставаться в рамках "их" подхода.

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: Создание оглавления в djvu
« Ответ #23 : 19 ПЭТРам 2010, 14:47:43 »
57an
Цитировать
А неизвестно, когда DjvuLibre выпустят очередную подверсию с "правильным" djvused?
Я не знаю - спросите у Леона Боту.
Цитировать
Я бы все-таки хотел оставаться в рамках "их" подхода.
А Вы и сейчас можете скомпилировать самостоятельно такой djvused - возьмите исходники последнего DjVuLibre, вставьте туда последний исходник djvused из CVS DjVuLibre и скомпилируйте.

Цитировать
Попробуйте notepad2. Очень умна в плане кодировок.
Попробовал. Получилось! :) Перебирая кодировки, я случайно выяснил, что кодировка Unicode UTF-16 LE подходит. Т.е., если сохранить в этой кодировке в Notepad2 bat-файл, содержащий кириллицу (как в пути файла, так и в имени) - то djvused срабатывает нормально - причём даже старый djvused, до последнего исправления, т.е. который есть в DjVuOCR и DjVu Hyperlinks Editor.
Кстати, в AkelPad тоже можно в такой кодировке сохранить - но AkelPad немного менее наглядна, чем Notepad2.

Почему так - не знаю. Леон же сказал, что они понимают только UTF-8. Теперь подумаю, как программным путём запускать через UTF-16 LE консольные DjVuLibre-утилиты.
« Последнее редактирование: 19 ПЭТРам 2010, 15:51:01 от monday2000 »

Vadik789

  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
    • E-mail
Re: Создание оглавления в djvu
« Ответ #24 : 19 ПЭТРам 2010, 15:44:36 »
Ничего у меня не получается с UTF-8. :( Я сделал bat-file в кодировке "UTF-8 без BOM" (как и положено) - из ASCII-txt-файла путём сохранения его в программе AkelPad (единственное, что я нашёл; NotePad++ некорректно сохраняет) в bat-file. Пишет следующее:
У меня точно так же получалось. Я понял, тут дело вот в чем. Если эти же команды вы прокрутите на unix, то все сработает. А вот в Виндовс, из-за того, что имена файлов кодируются не в ютф-8, а в ютф-16, - программа не может различить: или же введенное в команде имя файла - это обычная побайтовая кодировка, по байту на символ, или же это ютф-8 - от одного до нескольких байт на символ.

В принципе, и так нормально. Но если б Леон захотел исправить, то путь только такой: добавить специальный флажок к командам, скажем -w, который будет означать, что мы находимся в виндовс и имена файлов закодировали в ютф-8. А потом, где-то в конце, перед обращением к API Виндовса, отвечающим за работу с файлами, программа должна перевести эту строку ютф-8 в ютф-16, вызвав функцию API MultiByteToWydeChar. А без этого флажка все должно работать по-прежнему (для совместимости с прежними программами), то есть имена файлов должны восприниматься, как закодированные в аскии.
« Последнее редактирование: 19 ПЭТРам 2010, 15:46:31 от Vadik789 »

Vadik789

  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
    • E-mail
Re: Создание оглавления в djvu
« Ответ #25 : 19 ПЭТРам 2010, 15:49:21 »
Попробовал. Получилось! :) Перебирая кодировки, я случайно выяснил, что кодировка Unicode UTF-16 LE подходит. Т.е., если сохранить в этой кодировке в Notepad2 bat-файл, содержащий кириллицу (как в пути файла, так и в имени) - то djvused срабатывает нормально
Кириллица - это еще не обязательно юникод, оно может сохранить просто в аскии имя файла. Попробуйте с таким файлом: εγлχщος.djvu

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: Создание оглавления в djvu
« Ответ #26 : 19 ПЭТРам 2010, 15:55:46 »
Vadik789
Цитировать
Попробуйте с таким файлом: εγлχщος.djvu
Попробовал. Сработало! :D (т.е. через bat-файл в UTF-16 LE).
Цитировать
Но если б Леон захотел исправить, то путь только такой: добавить специальный флажок к командам, скажем -w, который будет означать, что мы находимся в виндовс и имена файлов закодировали в ютф-8.
Что-то я это не понял. Зачем флажок? "Новый" djvused автоматически понимает верно как кириллицу в DOS-кодировке, так и Юникод.
Цитировать
А потом, где-то в конце, перед обращением к API Виндовса, отвечающим за работу с файлами, программа должна перевести эту строку ютф-8 в ютф-16, вызвав функцию API MultiByteToWydeChar.
Да, это Вы уже в своей программе должны сами делать - прямо перед вызовом djvused.
« Последнее редактирование: 19 ПЭТРам 2010, 16:00:41 от monday2000 »

Vadik789

  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
    • E-mail
Re: Создание оглавления в djvu
« Ответ #27 : 19 ПЭТРам 2010, 15:57:21 »
Урраааа!!!!!  :D

Vadik789

  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
    • E-mail
Re: Создание оглавления в djvu
« Ответ #28 : 19 ПЭТРам 2010, 16:12:42 »
Что-то я это не понял. Зачем флажок? "Новый" djvused автоматически понимает верно как кириллицу в DOS-кодировке, так и Юникод.
Это я написал до того, как выяснилось, что Юникод оно тоже понимает. Из ответа Леона я понял так, что в Виндовс оно в принципе не может работать с Юникодом. Теперь уже флажков не нужно.  :)

Да, это Вы уже в своей программе должны сами делать - прямо перед вызовом djvused.
Это и так делается - мне нужно лишь поменять кодировку имени файла в Юникоде с BE на LE.
« Последнее редактирование: 19 ПЭТРам 2010, 16:16:02 от Vadik789 »

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: Создание оглавления в djvu
« Ответ #29 : 19 ПЭТРам 2010, 16:22:19 »
Vadik789
Цитировать
мне нужно лишь поменять кодировку имени файла в Юникоде с BE на LE.
Если не трудно - напишите потом тут в топике тот кусок кода, который это делает (и запуск djvused) - в качестве иллюстрации - пригодится на будущее.