Возникла необходимость сконвертировать много файлов .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
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Конвертирование djvu в pdf с сохранением сегментации (pdfbeads) (2017)
- Форум CPUmode - a userspace application for changing CPU powersaving modes (2012)
- Форум [bash][dfm]Оно почему то всегда true. (2011)
- Форум PDF: туда и обратно - в FAQ (2006)
- Форум Найти виновника (2024)
- Форум imagemagick_пакетное добавление водяных знаков к картинкам с указанием имени папки (2023)
- Форум оцените скрипт. (2011)
- Форум [отредактировано] Скрипт обработки текста в shell работает медлено, нужно улучшение алгоритма (2008)
- Форум Отваливается соединение pptp (2006)
- Форум Вывод частей имени файла (2014)