LINUX.ORG.RU

Конвертирование djvu в pdf с сохранением сегментации (pdfbeads)

 , ,


3

3

Задача преобразования 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