В связи с STDU Viewer кинули тут замечательный XPS файл. Проблема была в том, что страницы рендерились крайне медленно, т.е. тормозило все жутчайшим образом. Первая мысль была что народ в очередной раз чего-то отсканировал c 600 dpi разрешением и закрутил в xps. Думаю, эко до чего техника дошла, раньше все в djvu и pdf гнали, а теперь значит и до xps добрались. Причем размер у файла был вполне себе достойный, больше 30 метров, что подозрения усиливало.
Но выяснилось, что все намного веселее.
Нас самом деле xps, он как бы сильно похож на pdf, т.е. то же документ с подготовленными к печати страницами, часть данных может быть представлена в векторном виде (причем вроде как тут инструментов у xps даже побогаче), часть в растровом, часть просто как текст, причем и шрифты можно внедрить. Надо сказать, xps видится мне форматом существенно прямее и четче чем pdf, хотя и не без своих заскоков. В pdf например, есть понятие потока и соответственно кодированного потока, ну и есть пяток разных кодеров, типа Deflate, jpeg, CCITT и прочем RLE, причем над данными, которые вы хотите положить в pdf файл, вы можете последовательно надругаться разными кодеками. Понятно, что по-большому счету вот это вот последовательное применение нескольких кодеков над одними и теми же данными нужно крайне редко (т.е. я вообще не припомню, чтобы с таким сталкивался, хотя и допускаю, что кто-то где-то и когда-то этим пользовался и может даже пользуется до сих пор). При этом совершенно очевидно, что ч/б картинки будут кодироваться CCITT или JBIG2, цветные jpeg или jpeg2k ну, а текстовые данные Deflate или LZ77 (вроде LZ77 там тоже есть лезть проверять в спеку лень). Но все как обычно сделано очень обще, при том, что вся эта общность вырождается во вполне конкретную частность в 95% случаев, и еще кучу работы чтобы поддержать оставшиеся 5%. В отличие от pdf в xps все проще и от того приятнее для реализации, причем сильно сомневаюсь, что можно найти pdf не переводимый в xps.
В xps правда есть свои веселые заморочки, типа virtual brush с дикой вложенностью, но в целом формат на мой вкус попрямее, и думаю если микрософт его не забросит, в конечном итоге он должен pdf придушить. Хотя судя по скорости распростронения электронных читалок, есть вполне приличная вероятность, что скоро форматы с четким разбитием на страницы сдохнут уже все скопом, а выживут всякого рода ePub, FB2 и прочие MOBI. А если учесть, что гугл всерьез решил пересканировать всю мировую литературу, перспектива, лично меня, сильно радует.
Возвращаясь к тому файлу xps с которого все началось. Итак, открываю файл начинаю разбираться чего там внутре. Честно говоря, давно я так не удивлялся.
Как известно современные шрифты (да вообщем, и не очень современные тоже, поминая METAFONT Кнута), задают каждую буквовку набором кривых, от чего собственно шрифты и называются векторными. Так вот ребята готовившие документ, не стали внедрять шрифты, а просто перевели весь текст в набор кривых, благо формат xps вполне это повзоляет.
Плюс на мой взгляд только один. Документ по сути разом стал Read Only, т.е. скопировать оттуда текст стало фактически не возможно штатными средствами. Из минусов размер документа раздулся до невозможности, т.е. если его растерезовать с разрешением 600DPI и потом загнать в pdf с JPBIG2 кодеком или в djvu, то этот самый растровый документ будет раз в 10 меньше по объему (а может и в 20). Ну и понятно что скорость рендеренга такого документа резко снизилась, потому что одно дело когда шрифт растеризуется и кешируется, и другое когда кешировать особенно нечего и каждый символ приходиться растеризовать заново.
С одной стороны столь элегантное решение по созданию Read Only документов не может не радовать, с другой плодить энтропию в таких объемах мягко говоря выглядит не экономно.
четверг, 24 февраля 2011 г.
Про мега варианты защиты текста в XPS
среда, 2 февраля 2011 г.
Про формат epub, русские народные сказки и прочее
Понадобилось мне тут поразбирать файлы в формате epub. Я в свое время на этот формат уже смотрел, и помнилось мне, что все там просто. Т.е. всего то запакованный в зип набор html-к, картинок и css-ок, плюс некая главная xml-ка в которой прописано, в каком порядке те html-ки собираются в книжку.
Начал смотреть. Собственно первая задача, это определить, который из файлов в зипе есть та самая главная xml-ка. Как бы сделал я будь я составителем стандарта? Я бы сделал просто. Сказал бы, вот вам граждане зип, кладите туда чего хотите, с какими хотите названиями и папками, но опосля всего этого безобразия будьте любезны положить туда же в корень архива файл main.opf, который бы описывал чего жеж с тем что вы в зип понапихали делать. Оно, конечно, может в тот момент я был бы не в духе и заставил бы бедных граждан называть тот файл general.opf, а то и TyrpYRMyrDYR.opf, всяко бывает. Но как-то вот так, да.
Как же оно реализовано мега гражданами составителями формата? Естественно, там не такие простаки, поэтому все существенно круче, а именно.
В зипе должна обязательно быть папка META-INF, в папке той должен быть обязательно файл container.xml, в том файле, который кстати "содержит XML которая использует "urn:oasis:names:tc:opendocument:xmlns:container" namespace для всех ее элементов и аттрибутов." Да так вот в этом container.xml должен содержаться элемент
Я когда все это прочитал, понял, что что-то это мне напоминает.
"Смерть Кащея на конце иглы, игла в яйце, яйцо в утке, утка в зайце, заяц ларце, ларец на дубе, дуб на острове, остров хер пойми где" а теперь Ваня шкандыбай в сторону того острова и отстреливай весь этот зоопарк.
Самое интересное во всем этом мегаконструкте, полнейшее отсутствие полезности. А местами даже вредность. На 10 epub файлов скаченных из разных мест и созданных явно разными программами, не нашлось ни одного, в котором бы файл container.xml содержал что-то кроме ссылки на файл. Кто-то называл тот главный файл main.opf, кто-то general.opf, кто-то запихнул его не в корень архива, а подпапку, но по сути весь этот восторг разнообразия, программистам писавшим редакторы или конвертеры в epub вряд ли нужен. Если бы в спецификации было четко написано, как назвать главный файл они бы его так и назвали и вряд ли сильно расстроились за такое тоталитарное измывательство над креативными людьми.
Самое грустное, что это вот странное желание не упростить сложное, а усложнить простое, оно последние время наблюдается практически везде в ПО. "Давайте мы сейчас зафигачим такой формат, такой общий, такой абстрактный, что только держись". И понеслось, навертели такое, что реализовывать поддержку того формата целиком не упиралось уже даже монстрам индустрии, после чего начинаются дальнейшие радостные крики, а вот профиль 0, это когда мы из нашего мега формата отрезали вот это, вот то и еще здесь оставили только параметры от 0 до 2, а не от 0 до 2 в 32-й как было изначально, а вот профиль 1, там мы тоже все обчекрыжали и файл должен быть тока в UTF-8. Абалдеть.
Собственно, если начать сравнивать форматы сделанные лет 10-15 назад и сейчас, отличие разительно и совершенно очевидно. Берем Word-овский doc, благо теперь его открыли - все просто понятно, все пляшет от практических нужд, видно что делалось оно людьми, которые пишут программы, причем не программы вообще, а вот один из лучших текстовых редакторов (как по мне так и лучший), а не пытаются поковырявши в носу или где то там еще выдумать "чего бы там могло бы быть если бы оно бы туда бы и чтобы всем бы круто, вот". Берем DjVu тоже все четко и понятно, PDF старенький - все отлично, потом пошли формы, 3Д, мультимедиа и прочее и прочее и прочее. Смотрим, например, спецификацию 1.7. на PDF: "Sound, Movies, 3D artwork"... граждане, башку то включите, хочется интерактивных документов со всеми этими вашими мультимедиа, дык кто же спорит - здорово, но при чем тут PDF, который разбит на страницы и вообще подготовлен к печати, это ж PostScript по факту то, чего из него HTML то делать, мало что-ли HTML?
Из относительно новых, только FB2 греет мне душу, простой понятный и главное ровно то что нужно, для задачи хранения книги в библиотеки и ее отображения на компьютере. Т.е. люди представляли для чего им нужен формат, а не пытались сделать нечто чем можно и гвозди забивать, и стихи писать.
Вообщем ситуация навевает грусть, ибо вместо того чтобы сделать простое просто, а сложное постараться упростить, имеется тенденция, усложнять простое, а сложное и вовсе не делать.
пятница, 9 мая 2008 г.
Про формат DjVu
Хочется слегка упорядочить свои мысли про DjVu. Чем и займусь.
Почему-то DjVu всегда сравнивают с PDF, что, на мой взгляд, не корректно. Потому что специфика использования PDF и DjVu совершенно различная.
Единственное предназначение DjVu - это хранение отсканированных изображений. Причем не абы, каких изображений, а, если говорить упрощенно, печатного текста. И в этой нише он отлично работает. Но на этом применимость DjVu заканчивается.
Если начинать сравнивать DjVu с другими форматами, то надо в качестве оппонента выбирать многостраничный TIFF с каким-нибудь CCITT4 внутри. Потому что задачи, выполняемые тем и другим весьма похожи. А с PDF сравнивать глупо. Возможность хранить отсканированные документы в формате PDF, это, мягко говоря, далеко не все, что PDF умеет. Т.е. просто это не то для чего PDF предназначен и для чего он изначально разрабатывался. Такое использование PDF с родни забиванию гвоздей сковородкой, в принципе, можно, но не очень удобно и сковородку жалко.
Но вернемся непосредственно к DjVu и рассмотрим подробнее, что у него внутри такого, что делает его настолько привлекательным для хранения отсканированных изображений.
А внутри у него реализована одна простая идея, которая называется алгоритм JB2.
Задумаемся, как лучше всего сжать печатный текст? Правильно, лучше всего разбить его на символы, каждому символу поставить в соответствие некоторый код. Теперь имея картинки для всех символов в документе, мы, кодируя страницу, создаем список кодов символов и их координаты на странице. Поскольку различных символов в тексте обычно не так чтобы много, и они имеют тенденцию повторяться, то мы резко сократим объем занимаемый изображением.
Посчитаем идеализированный вариант.
Возьмем страницы A4 с 600 DPI в черно-белом варианте (т.е. каждая точка кодируется в один бит). Имеем
8.27' * 600 * 11.7' * 600 = 34 833 240 б = 4 354 155 Б = 4.1 МБ
Это если ничего не сжимать.
А теперь, рассмотрим текст на этой странице. Поскольку мы рассматриваем вариант оптимальный для сжатия алгоритмом DjVu, то текст будем писать одним шрифтом и на одном языке (например, на русском), тогда для кодирования одного символа нам хватит 7 бит. Но мы не будем жадничать и положим 1 байт (тогда можно в тексте использовать 256/66, практически, 4 разных шрифта, если продолжать писать только на русском, ну или русский и английский язык и два шрифта). Для кодирования позиции символа на странице нам достаточно будет 4 байт (достаточно даже и трех, но опять не будем жадничать). Таким образом, для одного символа понадобится 5 байт.
Стандартно на странице умещается примерно 1 800 печатных символов, таким образом, имеем
1 800 * 5 Б = 9 000 Б = 0.00858 МБ
Итого более чем в три с половиной тысячи раз.
Очевидно, что сюда надо приплюсовать картинки для тех 256 символов, которые мы собираемся использовать (они, кстати, займут значительно больше места, чем сам кодированный текст). Но если страниц в документе много, а картинки для символов, будут едины для всего документа, то и этот объем нивелируется.
Конечно же, это описание идеи в чистом виде, практика вносит свои нюансы, которые в формате DjVu с успехом решаются.
Собственно о преимуществе DjVu на этом все.
А теперь про PDF.
В PDF есть схожий кодер JBIG2. Пока мы в своем DjVu to PDF конвертере используем CCITT4 кодирование и размер результирующего PDF файла отличается от исходного DjVu практически на порядок (PDF естественно больше). Интересно будет попробовать заменить CCITT4 на JBIG2 и посмотреть насколько это уменьшит размер PDF. Есть мнение, что если сделать все по уму, то существенно.