avatar

djamba

карма
8,0
12 голосов
рейтинг
4,0
13 октября 2011 в 04:40

Читаем DJVU и PDF на шестидюймовом ридере с комфортом из песочницы

Бытует мнение, что на электронных книгах с e-ink дисплеями, можно комфортно читать только текстовые книжки, где можно выставить большой шрифт, а вот pdf и тем более сканы в djvu читать практически невозможно, глаза сломаешь разбирать мелкие буквы на небольшом дисплее. Спешу вас разуверить, читать такие книги вполне можно комфортно.


Это у меня уже вторая электронная книга и прочитано на ней уже довольна много книг, объемных, большая часть из которых и составляет техническая литература, которую в fb2 формате не найдешь. С книгой которую я купил первой, шла замечательная утилита JaP (Just Another Printer), которая умела нарезать pdf и djvu на куски, для четных и не четных страниц можно было выставить свою рамку, так же можно было добавить контраста, и все это дело она сохраняло в формат моей книги wolf. Для хорошего качества книг, допустим купленных или качественно сосканированных этого вполне было достаточно, но сканы плохого качества, а таких было не мало, страницы прыгали на листе, поля разнились, так что приходилось чуть ли не для каждой страницы выставлять рамку отдельно.

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

Внизу приведен сам код скрипта, он довольна прост и без излишеств, так как писался в основном для себя. Самые главные строчки в нем это обрезание полей, разрезание страницы на три части с помощью ImageMagic и увеличение резкости, т.к. после уменьшения размера картинки резкость теряется, еще можно для запущенных вариантов поиграть с контрастом. Работу скрипта проверял на Ubuntu 10.04, для работы должны быть установлены ImageMagic, libtiff, pdftk и DjvuLibre. Как показала практика, djvu несколько тяжеловат для моего ридера, а вот pdf встроенный xPdf читает просто на ура, скорость перелистывания в pdf-файлах размером более 300Мб на уровне того же fb2. Да кстати о размере, файлы получаются огромными от 100Мб и до 300 и больше даже, в принципе при сегодняшней цене на флешь память это не так критично. Пробовал уменьшать DPI но при 16 градациях это заметно становится, поэтому оставил как есть, может кто подскажет как уменьшить размер без заметных потерь в качестве, буду благодарен.

#!/bin/bash
# скрипт для преобразования PDF и DJVU файлов в формат для эклектронной книги 800x600

# использование: скрипт документ -in_[pdf|djvu] -out_[pdf|djvu] -img_format_[png|jpg]
in_format=$2
out_format=$3
img_format=$4

if [ "$img_format" = "-img_format_png" ];
then
  img_format=png
else
  img_format=jpg
fi

mask="*.*"

if [ "$in_format" = "-in_djvu" ];
then
   # если это DJVU то приобразовываем его в многостраничный TIFF
   ddjvu -format=tiff $1 1.tiff
   # режем получившийся TIFF в по страницам
   tiffsplit 1.tiff
   rm 1.tiff
   mask="x*.tif"
else
   # режем PDF по страницам
   pdftk $1 burst
   mask="pg_*.pdf"
fi

pages=""

# обработать все страницы
for p in `ls -1 $mask`; do

   # конвертируем страничку в JPG и преобразуем в оттенки серого
   if [ "$in_format" = "-in_djvu" ];
   then
      convert -colorspace gray -normalize -contrast $p $p.${img_format}
   else
      convert -density 300 -colorspace gray -normalize -contrast $p $p.${img_format}
   fi

   rm $p

   p=${p}.${img_format}

   # обрезаем все поля автоматически
   convert -trim +repage $p $p
   
   # вырезаем верхнюю часть картинки
   convert -gravity North -crop 100%x35% +repage $p 1_$p
   # вырезаем вторую часть картинки
   convert -gravity Center -crop 100%x35% +repage $p 2_$p
   # вырезаем третью часть картинки
   convert -gravity South -crop 100%x35% +repage $p 3_$p

   rm $p
   
   # меняем разрешение на 800х600
   convert -scale 800x600! 1_$p 1_$p
   convert -scale 800x600! 2_$p 2_$p
   convert -scale 800x600! 3_$p 3_$p
   
   # разворачиваем на 90 градусов
   convert -rotate 90 1_$p 1_$p
   convert -rotate 90 2_$p 2_$p
   convert -rotate 90 3_$p 3_$p
   
   # улучшаем качество картинки
   convert -sharpen 0.01 1_$p 1_$p
   convert -sharpen 0.01 2_$p 2_$p
   convert -sharpen 0.01 3_$p 3_$p
   
   # если выходной файл DJVU
   if [ "$out_format" = "-out_djvu" ];
   then
      # конвертируем странички в djvu-формат
      c44 -dpi 150 1_$p 1_$p.djvu
      c44 -dpi 150 2_$p 2_$p.djvu
      c44 -dpi 150 3_$p 3_$p.djvu
	  
      # список страничек
      pages=${pages}' 1_'${p}'.djvu 2_'${p}'.djvu 3_'${p}'.djvu'
    else
      convert -define pdf:use-trimbox=true -density 200 1_$p 1_$p.pdf
      convert -define pdf:use-trimbox=true -density 200 2_$p 2_$p.pdf
      convert -define pdf:use-trimbox=true -density 200 3_$p 3_$p.pdf
      
      # список страничек
      pages=${pages}' 1_'${p}'.pdf 2_'${p}'.pdf 3_'${p}'.pdf'
    fi

    rm 1_$p 2_$p 3_$p
done

# создаем выходной файл книжки
if [ "$out_format" = "-out_djvu" ];
then
  # собрать в единый DjVu
  djvm -c out.djvu $pages
else
  # собрать в единый PDF
  pdftk $pages cat output out.pdf
fi

rm $pages



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



Книга со страницами порезанными на три части:



А вот для примера и книга со страницами порезанными на четыре части, по мне так уже немного перебор:



UPD: Пользователем alakond был предложен способ как несколько снизить размер выходного файла, для этого использовать PNG формат в качестве промежуточного формата изображений вместо Jpeg, в скрипт добавлены его изменения для выбора промежуточного формата.
+45
8991
176
djamba 4,0

Комментарии (37)

+10
abyrvalg #
Очень хотел купить 9" e-ink для чтения документации (в основном оракловой). Отказался от покупки из-за того, что даже на таком экране оракловые PDF`ки выглядят нечитабельно.

У меня огромная просьба к Вам: прогоните, пожалуйста, через свой скрипт, например, вот этот документ download.oracle.com/docs/cd/E11882_01/server.112/e16638.pdf (великоват, да) и выложите скрины 72-ой страницы (она же 4-9). Найдите, пожалуйста, время. Может, я после этого всё-таки передумаю и куплю. Достали уже кипы бумаг во всех углах :)

PS: не стал писать в личку, т.к. читателям тоже может быть интересно посмотреть на результат.
+3
Disasm #
На 9" даже с разворотом плохо видно?
+3
abyrvalg #
Видно-то хорошо (для глаз). Только полезной информации влезает очень мало. Неудобно работать с документом. Расстройство одно.
+3
kastaneda #
Думаю, вы существенно упростите задачу автору если выдерните самостоятельно именно те страницы, которые вас интересуют. Например, с помощью утилиты pdftk
0
abyrvalg #
ой, какая хорошая утилита, спасибо. Автор может взять отдельно выдернутую страницу по ссылке zalil.ru/31859635
+3
djamba #
ок, сейчас пока ни ридера, ни линукса под рукой нету, как доберусь домой — проверю и выложу
0
konkere #
Что-то как-то не очень получилось, не?
И размер с 42 увеличился до 317-ти кб.
+1
djamba #
извиняюсь за качество изображений, вечер, вот как-то так получилось:


+1
abyrvalg #
Спасибо, для шести дюймов это, по-моему, просто супер. Если обрезать колонтитулы, то будет совсем хорошо.

Ещё одно отдельное и огромное спасибо за то, что открыли мне глаза. Оказывается, с июня месяца вся оракловая документация доступна не только в html и pdf, но также в mobi и epub. Скачал, завтра пойду в магазин проверять.
0
Xitsa #
Для обрезания колонтитулов идеально подходит Briss.
0
djamba #
Можно обрезать в скрипте так же, перед обрезкой, мне приходилось как-то это делать, когда покупал книги на books.ru они одно время в книги вставляли колонтитул в самом верху что эту книгу купил такой-то и такой-то, проживающий по такому-то адресу, я у них просто покупал еще и бумажные книги и вся информация обо мне там у них была, сейчас вроде когда покупал последнюю книгу такого больше не было.
Вот как можно обрезать колонтитул, не универсально правда, нужно подобрать сначала размер будет:
...
# отрезаем колонтитул
convert -gravity South -crop 100%x85% +repage $p $p

# обрезаем все поля автоматически
convert -trim +repage $p $p
...
0
Error_403_Forbidden #
На Kindle DX эта страница отображается на ура.
0
ZorroGFS #
касательно оракловских док, что мешает их скачать в mobi или epub форматах?
+6
UshkurKayuf #
Спасибо, интересно!

Думаю, что было бы круто добавить настроек и сделать это web-сервисом. Представляется, что нашлись бы сочувствующие.
0
djamba #
довольна тяжёлая операция, поэтому это несколько проблематично будет думаю, вот сделать вариант для windows думаю можно, все используемые инструменты существуют и под windows, а линукс конечно все таки не так много у кого есть
0
olexandr17 #
было бы отлично, если бы кто-то сделал подобное под виндовс
0
degorov #
0
igolovin #
Может не совсем в тему, но мне вот это несовсем понятно:
«Бытует мнение, что на электронных книгах с e-ink дисплеями, можно комфортно читать только текстовые книжки, где можно выставить большой шрифт»
Что вы понимаете под «большим шрифтом»?
+5
djamba #
для текстовых форматов можно выставить любой шрифт, любого размера, какой вам будет комфортен, так что под «большим» я понимаю — комфортный, который легко можно читать на расстоянии вытянутой руки, не прибегая к помощи увеличительного стекла :)
+2
x1shn1k #
Я не понял, на выходе получаются картинки порезанные, или распознанный документ? Знаю софт, который переводит сначала в картинки, а потом их режет. Но мне такой вариант не подходит, потому как в Киндле использую словарь англ-русс, и вариант с картинками не годится.
0
konkere #
Да, картинками получается.
0
Agent_Smith #
в киндле есть Duokan
+1
x1shn1k #
Есть. Но, насколько я помню, если читать через эту прошивку не-pdf книги, то русские шрифты выглядят коряво. А постоянно переключаться между Duokan и стандартной прошивкой нет никакого желания.
–1
sepich #
Правильным решением все же было бы распознавание текста и чтение его потом с reflow. Не вижу особой проблемы в этом, картинки в тексте сохраняются.
0
coderun #
и как сваять такой скриптик?
0
sepich #
скрипт не нужен, finereader.abbyyonline.com и иже с ними
0
coderun #
ага, а что на счет djvu с текстовой подложкой?
0
sepich #
а что насчет него? он поддерживается
0
coderun #
ага и 10 баксов за 200 страниц. Смысл тогда электронных книг? =)
0
mukizu #
ммм, слабо вижу это как замену моему покетбуку на 9,7"
+1
banderlog #
по поводу размеров файлов:
djvu в 10Mb конвертируеться с помощью ddjvu в 19Mb pdf. тут размер растет из-за того, что jpeg, из которого состоит новый pdf, несколько менее приспособлен для хранения монохромной инфы (вообще то никак).

Если пропустить книгу через Ваш скрипт, то размер pdf возрастет до 108Mb. Но тут уже jpeg не причем.
Вы каждую четвертушку увеличиваете до 800x600 — 800*600*4 => 1920000
В то время как размер исходной страницы djvu или pdf'а через ddjvu — 485x685 (485*685 = 332225)
1920000/332225 ≈ 5.8
19.2 * 5.8 ≈ 110Mb

Так что тут особо размер не уменьшишь
0
coderun #
djvu не собирает. также неплохо бы убираться за собой, но скрипт такого не умеет
0
djamba #
спасибо, действительно не собирается, просто не первая версия скрипта, и djvu давно им не собирал, исправил и добавил удаление всех временных файлов
0
kontiky #
А что — софт ридера не умеет масштабировать страницы?
0
kontiky #
И что это за утилита — convert — которая сама умеет распознавать и удалять поля?
0
Stvad #
djvu out + png ==
Not a JPEG file: starts with 0x89 0x50
*** [1-14410] Unknown PPM file format.
*** (JPEGDecoder.cpp:166)
*** 'static void DJVU::JPEGDecoder::decode(DJVU::ByteStream&, DJVU::GPixmap&)'
что я делаю не так?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.