Задача преобразования djvu в pdf рассматривалась на ЛОРе много раз. Но предлагаемые до этого методы сводятся к тупому преобразованию djvu в tiff с последующим преобразованием в pdf. Такое преобразование приводит к потере сегментации mask+fg+bg и существенным искажениям там, где они нежелательны.
В данном топике предлагаю скрипт, извлекающий изображения из djvu в сегментированном виде. Скрипт заточен под pdfbeads, так как это пока единственный известный мне генератор pdf из сегментированных изображений.
cat djvubeads.sh
#!/bin/bash
tprogs=""
if [ ! -f "/usr/bin/djvused" ]
then
# djvused, ddjvu, djvuextract, djvumake <- djvulibre-bin
if [ "+$tprogs" != "+" ]
then
tprogs="$tprogs, "
fi
tprogs="$tprogs""djvused (djvulibre-bin_*.deb)"
fi
if [ ! -f "/bin/grep" ]
then
if [ "+$tprogs" != "+" ]
then
tprogs="$tprogs, "
fi
tprogs="$tprogs""grep (grep_*.deb)"
fi
if [ ! -f "/usr/bin/awk" ]
then
if [ "+$tprogs" != "+" ]
then
tprogs="$tprogs, "
fi
tprogs="$tprogs""awk (gawk_*.deb)"
fi
if [ ! -f "/usr/bin/convert" ]
then
if [ "+$tprogs" != "+" ]
then
tprogs="$tprogs, "
fi
tprogs="$tprogs""convert (imagemagick_*.deb)"
fi
if [ "+$tprogs" != "+" ]
then
echo "!!!!"
echo " Not found $tprogs!"
echo "!!!!"
exit 1
fi
function usage()
{
echo "DjVu extract mask+fg+bg."
echo
echo "USAGE: bash $0 [options] djvufile"
echo "options:"
echo " -o Name output path (default = djvuname);"
echo " -q N quality jpeg compression (default = 50);"
echo " -h help."
echo
exit 1
}
if [ $# = 0 ]
then
usage
fi
tq="50"
while getopts ":o:q:h" opt
do
case $opt in
o) dst="$OPTARG"
;;
q) tq="$OPTARG"
;;
h) usage
;;
*) echo "Unknown option -$OPTARG"
exit 1
;;
esac
done
shift "$(($OPTIND - 1))"
src="$1"
if [ -z "$dst" ]
then
dst="${src%.*}"
fi
echo "$src"
echo ""
mkdir -pv "$dst"
tpages=`djvused -e 'n;' "$src"`
tlist=`djvm -l "$src" | grep "djvu$" | awk '{ print $4 }'`
i=0
for tpage in $tlist
do
let i=i+1
let j=10000+i
tname="$dst/page-${j:1}"
fginfo=""
bginfo=""
ddjvu -format=tiff -page=$i "$src" "$tname.tif"
fginfo=`djvused "$src" -e "select $i; dump" | grep -m 1 "FG44" | awk '{ print $10 }' | tr "x" " "`
bginfo=`djvused $src -e "select $i; dump" | grep -m 1 "BG44" | awk '{ print $10 }' | tr "x" " "`
if [ ! -z "$fginfo$bginfo" ]
then
convert "$tname.tif" "$tname.png"
rm "$tname.tif"
ddjvu -format=pbm -mode=mask -page=$i "$src" "$tname.pbm"
convert -compress Group4 "$tname.pbm" "$tname.black.tiff"
rm "$tname.pbm"
echo "Page $i: Image"
else
convert "$tname.tif" "$tname.png"
rm "$tname.tif"
convert -compress Group4 "$tname.png" "$tname.tif"
rm "$tname.png"
echo "Page $i: Mask"
fi
if [ ! -z "$fginfo" ]
then
fgw=`echo "$fginfo" | awk '{ print $1 }'`
fgh=`echo "$fginfo" | awk '{ print $2 }'`
djvuextract "$src" -page=$i FG44="$tname.fg44"
djvumake "$tname.fg44.djvu" INFO=$fgw,$fgh,300 BG44="$tname.fg44"
rm "$tname.fg44"
ddjvu -format=ppm "$tname.fg44.djvu" "$tname.fg.ppm"
rm "$tname.fg44.djvu"
convert -quality "$tq" "$tname.fg.ppm" "$tname.fg.jpg"
rm "$tname.fg.ppm"
fi
if [ ! -z "$bginfo" ]
then
bgw=`echo "$bginfo" | awk '{ print $1 }'`
bgh=`echo "$bginfo" | awk '{ print $2 }'`
djvuextract "$src" -page=$i BG44="$tname.bg44"
djvumake "$tname.bg44.djvu" INFO=$bgw,$bgh,300 BG44="$tname.bg44"
rm "$tname.bg44"
ddjvu -format=ppm "$tname.bg44.djvu" "$tname.bg.ppm"
rm "$tname.bg44.djvu"
convert -quality "$tq" "$tname.bg.ppm" "$tname.bg.jpg"
rm "$tname.bg.ppm"
fi
done
Применение:
bash djvubeads.sh test_file.djvu
...
cd test_file
pdfbeads -m G4 -b JPEG -o ../test_file.pdf
В pdfbeads используется сжатие Group4 для черно-белых изображений и JPEG для цветных масок. Возможно использование jbig2 для черно-белых изображений и JPEG2000 для цветных масок при определённой модификации скрипта, но это плохо совместимо с портативными устройствами, поэтому здесь не рассматривается.
Результирующий pdf имеет размер ~3*djvu, при этом искажения минимальны (только на цветных масках).
Результат:
ls -l
итого 71864
-rw-r--r-- 1 zvezdochiot zvezdochiot 3205 Апр 15 13:00 djvubeads.sh
-rw-r--r-- 1 zvezdochiot zvezdochiot 871 Янв 30 19:02 pdfinfocopy.sh
-rw-r--r-- 1 zvezdochiot zvezdochiot 2947707 Июл 12 2016 Книга_01-Эйнштейн-Теория_относительности.djvu
-rw-r--r-- 1 zvezdochiot zvezdochiot 12072915 Апр 14 23:50 Книга_01-Эйнштейн-Теория_относительности.pdf
-rw-r--r-- 1 zvezdochiot zvezdochiot 2012411 Июл 12 2016 Книга_50-Чандрасекар-Звездная_эволюция.djvu
-rw-r--r-- 1 zvezdochiot zvezdochiot 11242989 Апр 15 11:25 Книга_50-Чандрасекар-Звездная_эволюция.pdf
-rw-r--r-- 1 zvezdochiot zvezdochiot 9312996 Апр 5 2015 Попов_ОБ-Рихтер_СГ-2007-Цифровая_обработка_сигналов_в_трактах_звукового_вещания.djvu
-rw-r--r-- 1 zvezdochiot zvezdochiot 31096585 Апр 14 23:32 Попов_ОБ-Рихтер_СГ-2007-Цифровая_обработка_сигналов_в_трактах_звукового_вещания.pdf
-rw-r--r-- 1 zvezdochiot zvezdochiot 1838167 Июл 12 2016 Специальный_выпуск-Перьевые_ручки.djvu
-rw-r--r-- 1 zvezdochiot zvezdochiot 2975375 Апр 15 11:13 Специальный_выпуск-Перьевые_ручки.pdf
Pdfbeads homepage: https://github.com/ifad/pdfbeads