LINUX.ORG.RU

djvu2any - дарю :)


0

0

Возникла необходимость сконвертировать много файлов .djvu в 
"обыкновенный" формат. Пришлось долго думать, в чём, собственно, суть 
кучи утилит в составе djvulibre.
В итоге родился простенький скрипт, делающй из djvuшника директорию со страницами. Пользуйтесь :)

Возможности:
=> Многопоточность (по числу процессоров)
=> ddjvu в моей сборке любит падать на ровном месте, скрипт запустит его повторно
=> Конвертация во множество различных форматов (за счёт imagemagick) 

Проблемы:
Очень большие большие изображения обрабатываются в несколько потоков гораздо медленнее из-за нехватки памяти, используйте команду
JOBS=1 djvu2any.sh file.djvu
чтобы принудительно использовать 1 поток.
Программа не прерывается по ctrl+c, надо "добивать" через
killall djvu2any.sh ddjvu convert

Вообще я не очень в программировании на шелле, наверно много сделал неоптимально. И с английским проблемы, но фиг с ним :)

Сам скрипт:

#!/bin/sh

# This program is free software, released under terms of GNU GPL3
# 2007 (c) Osypov Oleg [ legolegs at yandex ru ]

# requires: djvulibre, ImageMagick

FNAME=$1
TOFORMAT=$2
if [[ "$FNAME" == "" ]]; then
	echo "Usage: $0 file [to_format (default: png)]" 1>&2
	exit 1
fi
if [[ "$TOFORMAT" == "" ]]; then
	TOFORMAT=png
fi
DIRNAME=`echo $FNAME | sed "s/\.\w*$//"`
if [[ "$DIRNAME" == "$FNAME" || "$DIRNAME" == "" ]]; then
	DIRNAME=${FNAME}_export
fi
mkdir $DIRNAME
if (! touch $DIRNAME) ; then 
	echo "Cannot use dir \`\`$DIRNAME''" 1>&2
	exit 1
fi
PAGES=`djvudump $FNAME | grep INFO | wc -l`
if (($PAGES < 1)); then
	echo "0 pages found" 1>&2
	exit 1
fi
rm $FNAME.log 2> /dev/null
if [[ "$JOBS" == "" ]]; then
	JOBS=`cat /proc/cpuinfo 2> /dev/null | grep "^processor" | wc -l`
	if (($JOBS < 1)); then
		JOBS=1
	fi
fi
for j in `seq 1 $JOBS`; do
	for i in `seq -w $j $JOBS $PAGES`; do
		OK=true
		if (! ddjvu -format=ppm -page=$i $FNAME  $DIRNAME/$i.ppm ); then
			echo "ddjvu crush on page $i, retrying..." 1>&2
			rm $DIRNAME/$i.ppm 2> /dev/null
			if (! ddjvu -format=ppm -page=$i $FNAME  $DIRNAME/$i.ppm ); then
				echo "ddjvu crush twice on page $i, logged" 1>&2
				echo "$i" >> $FNAME.log
				OK=false
			fi
		fi
		if ($OK); then
			convert $DIRNAME/$i.ppm $DIRNAME/$i.$TOFORMAT
			rm $DIRNAME/$i.ppm
		fi
	done &
	WAITUS="$WAITUS $!"
done
wait $WAITUS
ERRORS=`cat $FNAME.log 2> /dev/null | wc -l`
if (($ERRORS > 0)); then
	echo "$ERRORS pages are not exported, see \`\`$FNAME.log'' for numbers" 1>&2
fi
★★★★★
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.