Пересборка PDF

Сегодня возникла задача хитро распечатать pdf. Нужна была двусторонняя печать по две страницы на стороне.

То есть 1 и 2 страница на первой стороне, 3 и 4 на второй... ну и так далее.

Принтер таких хитрых настроек не имел, по этому пришлось выкручиваться. На помощь пришла утилитка imagemagic.

Задача делится на 3 части:

  1. разобрать pdf по страницам на jpg
  2. соединить по порядку по 2 jpg вместе
  3. снова собрать в pdf

Все это оказалось элементарно сделать при помощи пакета ImageMagic.

И так. Вперед по пунктам.

Разобрать pdf

Используем утилиту convert:

$convert source.pdf source.jpg

На выходе получаем кучу jpg-ов, пронумерованных от 0 до количества страниц -1.

Соединить jpg вместе

Тут нам на помощь приходит утилита montage.

$montage -geometry +4+4 source-0.jpg source-1.jpg output1.jpg

Собрать картинки в pdf

И опять пользуемся convert:

$ convert output1.jpg output2.jpg output1.pdf

В общем... Где-то так.

Вот только обычно в pdf далеко не 10 страниц. По этому сваял скриптик:

#!/bin/bash
#Создаем временную папку
mkdir tmp
# имя файла на входе
pfile=$1;
# сколько страниц обрабатываем
strn=$2

echo "Unpack pdf....";
# распаковываем в картинки
convert $pfile "tmp/${pfile%.pdf}.jpg";

echo "convert images.."
#в этом цикле склеиваем страницы
for i in $(seq 0 2 $strn);
do
fn=${pfile%.pdf}-$i.jpg;
let "t = i + 1";
fn1=${pfile%.pdf}-$t.jpg;

montage -geometry +4+4 "tmp/$fn" "tmp/$fn1" "tmp/$i-$t.jpg";
pdff=$pdff\ tmp/$i-$t.jpg;
done;

echo "create new pdf....";
pdff=$pdff\ res.pdf;
# и создаем новый файл
convert $pdff;

rm -rf tmp/*;
rmdir tmp;

Cкрипт вызывается с двумя параметрами - имя файла на входе и количество страниц в нем -1