О синхронизации номеров страниц книги и номеров копий этих страниц в DJVU-файле.

 

Введение

При работе с копией книги важным моментом является возможность быстро найти нужную информацию, используя оглавление или предметный указатель книги. А это означает, что по номеру страницы(или столбца), указанному в оглавлении или предметном указателе, необходимо открыть в Djvu-копии книги соответствующую страницу книги. В настоящее время программы чтения Djvu-файлов позволяют открыть нужную страницу-копию по ее порядковому номеру Ndisplay  (в дальнейшем - Nd) расположения в Djvu-файле.
Для решения этой задачи надо знать законы соответствия между номером Nprint  (в дальнейшем - Np), напечатанном на странице, и порядковым номером расположения этой страницы в книге, а также номером ее копии Nd в Djvu-файле.
Взаимосвязь между этими номерами зависит как от технического оформления книги, так и способов получения ее копии. Различают два способа копирования книги: книгу копируют постранично или целым разворотом. В первом случае каждую страницу копируют отдельно, и страница копии равна странице оригинала, при копировании разворотом на странице копии размещаются две страницы оригинала. В Djvu-копии страницы располагаются в том же порядке, что и страницы оригинала.
Как правило, в книгах объектами адресации являются номера страниц, реже, номера столбцов, когда текст на страницах книги печатается в два столбца.
 

Наша задача рассмотреть  зависимость между номерами Np и Nd при различном оформлении книги и различных методах ее копирования  в предположении, что в
Djvu-файле содержатся копии всех страниц книги и все страницы в книге пронумерованы.

I. В книге существует одна сквозная нумерация страниц.
1) книга скопирована постранично.
Nd=Np
имя алгоритма
- norm
2) книга скопирована методом разворота, порядок следования страниц на развороте чет-нечет.

Nd =Np/2 , если число Np - четное
Nd =(Np - 1/)2 , если число Np - нечетное
имя алгоритма - spread
3) книга скопирована методом разворота, порядок следования страниц на развороте нечет-чет.

Nd =Np/2 , если число Np - четное
Nd =(Np - 1/)2 +1 , если число Np - нечетное
имя алгоритма - two_page



II. В книге существуют две системы нумерации страниц. Вводная часть книги нумеруется отдельно от основной части.
Мы будем рассматривать только нумерацию основной части книги, номера которой используются в оглавлении и предметном указателе.
В этом случае функциональные зависимости остаются неизменными, но их значения смещаются на определенные числа. 
1) книга скопирована постранично.
Nd=Np+Nb, где Nb количество страниц, расположенных в вводной части книги, и которая обычно нумеруется числами в римской системе исчисления.

2) книга скопирована методом разворота, тогда начальный сдвиг Nbo:
Nbo =Nb/2 , если число Nb - четное
Nbo =(Nb + 1/)2 , если число Nb - нечетное

Nd =Nbo+Np/2 , если число Np - четное
Nd =Nbo+(Np - 1/)2 , если число Np - нечетное


3) книга скопирована методом разворота, порядок следования страниц на развороте нечет-чет.
Nbo =Nb/2 , если число Nb - четное
Nbo =(Nb + 1/)2 , если число Nb - нечетное

Nd =Nbo+Np/2 , если число Np - четное
Nd =Nbo+(Np - 1/)2 +1 , если число Np - нечетное.

Самый простой способ определения Nbo заключается в использовании вьювера djvu-файлов:
 

1. Открываем страницу книги с номером 1 и считываем значение счетчика страниц Nd:

2. Если книга отсканирована постранично или отсканирована разворотом, но порядок страниц нечет-чет(это равносильно постраничному сканированию книги, напечатанной в два столбца, при этом нумеруются столбцы а не страницы) , то Nbo= Nd-1, иначе при сканировании книги методом разворота с порядком страниц чет-нечет Nbo= Nd 
В примере Nd=6, Nbo=5

Ввод информации о методе сканирования в программе DJVUmark .

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

В случае однородного скана наличие в файле параметров строки "spread=yes" указывает на то, что книга отсканирована разворотом со стандартным порядком номеров страниц в развороте ( чет - нечет).  Наличие в строке "two_page=yes"  предписывает программе для установления соответствия между номерами Nd и Np использовать алгоритм, который свойственный развороту с порядком следования страниц нечет - чет. Это может быть как сканирование разворотом, так и постраничное сканирование страниц книги, напечатанных в два столбца. Если в файле параметров нет  ни одной из из перечисленных строк  ("spread=yes" или "two_page=yes"),  то означает, что книга отсканирована  постранично.

Случай смешанных сканов будет рассмотрен далее.


ЗАМЕЧАНИЕ. В рассмотренных случаях зависимость между номерами Np и Nd постоянна для всех номеров страниц книги. Другими словами нумерация страниц книги и DJVU-файла синхронизирована(согласована) на протяжении всей книги.


Нарушение синхронизации номеров страниц.


Потенциальными источниками нарушения синхронизации номеров страниц книги и ее Djvu-копии являются:
1. пустые страницы, вставленные для выравнивания главных разделов книги на правую сторону разворота книги независимо от того, учитываются эти страницы при нумерации книги или нет.
2. вставка страниц типа иллюстраций, которые не учитываются при нумерации страниц книги;
3. пропуск страниц из-за ошибок при сканировании;
4. ошибочное дублирование страниц при сканировании;
5. смешанные сканы, т.е различные части книги сканированы различными способами: одни постранично, другие разворотом.

Нарушение синхронизации происходит, если:
а) Пустые страницы учитываются при нумерации книги, а их выбрасывают при сборке книги. Это наиболее распространенный случай. Это эквивалентно ошибочному пропуску страниц при сканировании.
б) Имеются страницы типа иллюстраций (вообще страницы, которые не учитываются при нумерации страниц, это могут быть и пустые страницы ) в середине книги. Это эквивалентно дублированию страниц при сканировании.
в) Пустые страницы не учитываются при нумерации книги, а сканирование таких книг производится разворотом; это приводит к сложным нарушениям синхронизации номеров, которые эквивалентны по последствиям смешанным сканам п.5
г) Имеется комбинация перечисленных выше причин.

Практически нарушение синхронизации встречается относительно часто. На этот предмет нами изучены две небольшие библиотеки книг.
Удаленные страницы.
Так из 322 книг по обработке изображений, машинному зрению и распознаванию образов в 86 книгах отсутствовали нумерованные страницы, это примерно около 27%.
Очень близкие результаты получены и для библиотеке по оптике - из 411 книг в 96 книгах отсутствовали пронумерованные страницы, т.е. около 23%

Теперь о вставленных ненумерованных страницах (иллюстрации в середине книги): в библиотеке по оптике только в одной книге из 411 книг вставлены ненумерованные страницы; в библиотеке по обработке изображений в 4х книгах из 322 встретилась такая ситуация, причем в 3 случаях из этих 4х одновременно наблюдается и отсутствие пронумерованных страниц.

Нарушение синхронизации страниц книги и ее копии проявляется в том, что на протяжении всей книги зависимость между номерами Np и Nd перестает быть постоянной. Удаление пронумерованных страниц или вставка не нумерованных страниц изменяет значение начального сдвига Nbo.
Если удалена только страница с i-номером и в книге имеется N номеров страниц, тогда на отрезке номеров 1, i-1 сдвиг равен Nbo, на отрезке i,N сдвиг равен Nbo-1.
Очевидно, удаление k страниц уменьшает сдвиг на соответствующем интервале на k единиц. Вставка же k ненумерованных страниц увеличивает сдвиг на соответствующем интервале на k единиц.
Эта задача решается в программе DJVUmark. Имеется несколько вариантов решения этой задачи. В первых версиях программы предлагалось (эта возможность сохранилась и сейчас )эти сдвиги вычислять пользователю и вводить их в параметре shift. Если, например, пропущена 24 странице в книге, содержащей 200 страниц, Nbo=5, тогда shift={(1,23,5),(24,200,4)}.


В последних версиях DJVUmark сдвиги вычисляются программно, достаточно лишь ввести список отсутствующих страниц и/или список вставленных страниц.  Можно воспользоваться графическим интерфейсом или воспользоваться  заготовками комманд missing_pages= и not_numbered_pages= :

 // missing_pages=ч1,ч2,..чN  ч* - номер пропущенной страницы.
// not_numbered_pages=(ч1,ч2),(.,.)   ч1 - номер страницы, за которой вставлены ч2 - не нумерованных страниц
 

При использовании заготовок необходимо убрать признак комментария  "// " и после знака равенства ввести список страниц, согласно синтаксису команды. Например, missing_pages=20 30  105-107 для пропущенных страниц  и  not_numbered_pages=(51,1),(100,3.)   в случае вставленных страниц.


Если список отсутствующих страниц известен, то его можно ввести в соответствующее поле графического интерфейса или же список записать как строку с именем "missed_pages=" в файле параметров.
 

 

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

Теперь рассмотрим сказанное более подробно на конкретных примерах.

Синхронизация номеров страниц в случае однородных сканов.

Пример 1. Книга ADVANCES IN NONLINEAR SIGNAL AND IMAGE PROCESSING Edited by: Stephen Marshall and Giovanni L. Sicuranza.
Читаем книгу при помощи WinDjView. При Np=1 наблюдаем Nd=12 , т.е. начальный сдвиг Nbo=shift=11. Далее смотрим: при При Np=357 наблюдаем Nd=363, т.е. сдвиг shift=6
Таким образом сдвиг нумерации на отрезке номеров страниц (1,357) не постоянен. Как минимум 5 страниц не хватает.
Просим подсказку, какие номера страниц возможно удалены.


Программа генерирует список из 13 чисел.


Пытаемся программой WinDjView прочесть страницы из указанного списка. Оказывается, что страницы 102 204 272 300 356 отсутствуют. Редактируем список "probably no pages = ". Запоминаем результат.
Продолжаем работу программы DJVUmark выбрав опцию "Чтение списка из файла".


После работы программы в файле параметров записана строка с вычисленными значениями сдвигов в нумерации на соответствующих отрезках номеров.


Используя html-интерфейс, читаем различные страницы книги и убеждаемся, что все страницы вызываются правильно. Теперь можно внедрять файл bookmarks.htm. Для этого достаточно выполнить WinDjView.bat.
Если бы заранее было известно, что страницы 102 204 272 300 356 отсутствуют, то их сразу можно было ввести в соответствующее поле ввода



Пример 2. Книга HANDBOOK OF IMAGE AND VIDEO PROCESSING, A L Bovik, ed.
Читаем при помощи WinDjViewWinDjView. При Np=3 наблюдаем Nd=22 , т.е. начальный сдвиг Nbo=shift=19. Далее смотрим: при При Np=883 наблюдаем Nd=958 , т.е. сдвиг shift=75. Учитывая что Nbo=19, можно предположить, что вставлено 75-19=56
ненумерованных страниц.
При более внимательном наблюдении замечаем четыре группы цветных иллюстраций (272,8 картинок после 272 страницы и по 16 картинок после 512,704 и 880 страницы, т,е всего 8+16+16+16=56 картинок.
Поэтому в файл параметров записываем строку "not_numbered_pages=(272,8),(512,16),(704,16),(880,16)



Пример 3. Книга SCALE-SPACE THEORIES IN COMPUTER VISION, Nielsen Mads, Johansen Peter, Olsen Ole Fogh, Weickert Joachim (Eds.)
Читаем при помощи WinDjView WinDjView. При Np=1 наблюдаем Nd=12 , т.е. начальный сдвиг Nbo=shift=11. Далее смотрим: при  Np=529 наблюдаем Nd=535, т.е. сдвиг shift=6
Изучение файла djvu показывает, что после 470 следуют две разные страницы с номером 471 (одна лишняя), а страницы 422 и 478- 482 отсутствуют ( нету 6 страниц) итого 11+1-6=6 Это означает вычисленный сдвиг равен тому, который мы наблюдали вьювером.
Поэтому в файл параметров вставляем две соответстующие строки :



Синхронизация номеров страниц в случае смешанных сканов.

Файл со сложной системой сканированая может возникнуть при создании буклета из  копий статей, полученных из разных источников, так как при этом разные статьи могут иметь файлы djvu разных форматов. Для отдельных книг это выглядит экзотично. Хотя одну такую книгу (Simulation and Software Radio for Mobile Communications by Hiroshi Harada, Ramjee Prasad) автору этих строк пришлось обрабатывать. Часть книги была отсканирована постранично, другая часть книги - разворотом. Но сейчас мы хотим привести пример книги, отсканированной разворотом, где имеет место очень сложная функциональная зависимость между номерами Np и Nd.

Пример 4. Книга  ELECTROMAGNETIC WAVES AND ANTENNAS, Sophocles J. Orfanidis.

В книге 22 главы и Приложение. Это структурные элементы книги, начало которых должно быть выравнено на правую страницу разворота книги. Объем этих разделов такой, что выравнивать пришлось, только 19 разделов из 23. Для этого выравнивания было вставлено 19 пустых ненумерованных страниц, т.е. пустых страниц, наличие которых не учтено при нумерации страниц книги. При создании DJVU-копии этой книги, ее отсканировали разворотом и в итоге получили  (с точки зрения  вычисления соответствия номеров страниц книги и номеров копий этих страниц в djvu-файле)  эквивалент сложной системы сканирования. В самом деле страница, которая попала в разворот вместе с ненумерованной страницей должна рассматриваться как страница отсканирована обычным ( постраничным)  способом. Другие страницы, не имеющие в развороте ненумерованных страниц, это обычный разворот или разворот с порядком нумерации страниц нечет-чет. Причем эти два метода разворота могут чередоваться,  если ненумерованных страниц несколько. Таким образом на разных отрезках номеров страниц ( в данном примере их 19 ) должны использоваться различные алгоритмы вычисления  Nd как функции от Np. Имена этих алгоритмов: norm, spread, two_page.  Для каждого из этих алгоритмов еще надо указывать значение начального сдвига Nbo.

В программе DJVUmark эта информация задается двумя параметрами:shift_mode и shift. Формат задания объясним на параметрах, которые были заданы при обработке книги, рассматриваемого примера.
 

shift_mode={(1,35,spread),(36,36,norm),(37,79,two_page),(80,80,norm),(81,128,two_page),(129,129,norm),(130,149,spread),(150,150,norm),(151,182,two_page),(183,183,norm),(184,237,spread),(238,238,norm),(239,299,two_page),(300,300,norm),(301,358,two_page),(359,359,norm),(360,393,spread),(394,394,norm),(395,452,two_page),(453,453,norm),(454,472,spread),(473,473,norm),(474,521,spread),(522,522,norm),(523,567,two_page),(568,568,norm),(569,597,two_page),(598,598,norm),(599,633,two_page),(634,634,norm),(635,657,two_page),(658,658,norm),(659,722,two_page),(723,723,norm),(724,767,spread),(768,768,norm),(769,798,two_page),(799,799,norm),(800,851,spread),(852,852,norm),(853,901,two_page),(902,902,norm),(903,937,two_page),(938,938,norm),(939,973,two_page),(974,974,norm),(975,1020,two_page),(1021,1021,norm),(1022,9999,spread)}
 

shift={(1,35,16),(36,36,-2),(37,79,16),(80,80,-23),(81,128,17),(129,129,-47),(130,149,18),(150,150,-57),(151,182,18),(183,183,-63),(184,237,19),(238,238,-100),(238,299,19),(300,300,-130),(301,358,20),(359,359,-159),(360,393,21),(394,394,-176),(395,452,21),(453,453,-205),(454,472,22),(473,473,-214),(474,521,23),(522,522,-238),(523,567,23),(568,568,-260),(569,597,24),(598,598,-274),(599,633,25),(634,634,-291),(635,657,26),(658,658,-302),(659,722,27),(723,723,-334),(724,767,28),(768,768,-356),(769,798,28),(799,799,-371),(800,851,29),(852,852,-397),(853,901,29),(902,902,-421),(903,937,30),(938,938,-438),(939,973,31),(974,974,-455),(975,1020,32),(1021,1021,-478),(1022,9999,33)}
 

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

Этот пример показывает, что прежде чем сканировать, надо внимательно изучить свойства книги в плане используемой нумерации страниц и наличия вставленных страниц для выравнивания основных структурных разделов книги ( частей, глав, приложений и т.п.).  Если бы эту книгу сканировали постранично, то таких бы сложностей с синхронизацией номеров не возникло бы, при сохранении пустых страниц достаточно было бы вставить в файл параметров строку not_numbered_pages со соответствующим списком  номеров страниц,   или в случае удаления пустых страниц надо было  только задать один параметр shift=16 .