Возникла необходимость сконвертировать много файлов .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)