Конвертация PDF в JPEG
На новой работе поставили задание сделать проссмотрт PDF-версии газеты. Ну как-бутто читалку PDF. Ну мы то знаем, что никаким PDF в браузере и не должно пахнуть, а всё выводить будем в JPEG. Тоесть задача разбивается на 2:
- конвертировать PDF в JPEG
- выводить картинки, как бутто мы Acrobat Reader написали
Если с выводом почти всё ясно ( берём листалку какой-то галереи и вперёт на конях за махновцами), то как конвертировать на сервере да ещё в консоли Linux! А в том, что и прелесть Линукса, что всё в консоли.
Итак, сформируем подзадачу: надо каждую страничку PDF-файла превратить в удобочитаемый и сносный JPEG-файл. Поборол зверя я! Вот хронология событий.
ImageMagic
Сначала я пробывал конвертировать файл с помощью ImageMagic. Он хорошо это умеет, но местами, не пойму почему, в результате получается совсем не читаемый JPEG. Команда такова:
convert file.pdf -resize 1024 file.jpeg
В результате получим файлы на каждую страничку, да ещё и с шириной 1024.
Но, как я уже говорил, качество капец страдает, и некоторые странички совсем не читаемые. Я игрался и с качеством и разрешением – ничего, всё глухо.
PDFTOPPM
А потом я открыл для себя pdftoppm и ppmtojpeg! Вот, именно то, что конвертирует всё красиво и хорошо!
Механизм работы таков:
- конвертируем PDF в PPM:
pdftoppm file.pdf file.ppmи получаем набор файлов .ppm
- каждый .ppm файл конвертируем в jpeg
ppmtojpeg file.ppm > file.jpeg - ну и если хочется уменшить файлы. то тут уже надо ImageMagic
convert file.jpeg -resize 1024 file.jpeg
Если много страниц в PDF-файле, то придётся каждый .ppm конвертировать.
Заскриптуем всё это!
Так как всё это надо делать автоматически, то написал маленький скрипт, который находит все .pdf, конвертирует и разбрасывает по разным папкам. Чтобы всё заработало, надо создать директории:
- big – для картинок с размером 1024
- org – для оригинальных картинок
- tmp – временный каталог для .ppm
- trumb – для превьюшек
В директорию положить файлы PDF и скрипт ниже написаный:
#!/bin/bash
for g in `find . -name "*.pdf"`;
do
echo "Processing $g"
pdftoppm $g tmp/$g
#convert $g -density 4096 -resize 1200 -quality 100 big/$g.jpeg
for n in `find tmp/ -name "*.ppm"`;
do
tr=`echo $n | awk -F / '{ print $2 }'`
echo " Processing $tr"
ppmtojpeg $n > org/$tr.jpeg
convert org/$tr.jpeg -resize 1024 big/$tr.jpeg
convert big/$tr.jpeg -resize 75 trumb/$tr.jpeg
rm $n
done
done

