Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- if [ -z "$1" ]
- then
- echo "Usage: ebook2pdf.sh FILENAME WIDTH HEIGHT OVERLAP ROTATE DEPTH"
- exit 1
- fi
- date
- FILENAME=$(basename $1)
- FILEEXT=`echo "${FILENAME##*.}"|tr '[A-Z]' '[a-z]'`
- SRCDIR="."
- RAMDIR="/tmp/ramfs"
- RAMSIZE="1M"
- FULLNAME="$SRCDIR"/"$FILENAME"
- FILEID=`md5sum -b "$FULLNAME"|cut -f 1 -d ' '`
- mkdir "./ready" &>/dev/null
- RESDIR="./ready/$FILEID"
- if [ `mount | grep -c "$RAMDIR"` -eq 0 ]
- then
- mkdir "$RAMDIR" &>/dev/null
- chmod 777 "$RAMDIR" &>/dev/null
- mount -t ramfs -o size="$RAMSIZE" tmpfs "$RAMDIR" &>/dev/null
- echo "RAM Drive created"
- else
- echo "RAM Drive already exists"
- fi
- rm "$RAMDIR"/"$FILEID"-buf* &>/dev/null
- rm -r $RESDIR &>/dev/null
- mkdir $RESDIR &>/dev/null
- rm $FILENAME.pdf &>/dev/null
- OUTBUF1="$RAMDIR"/"$FILEID"-buf1
- INBUF1="$RAMDIR"/"$FILEID"-buf1.pgm
- OUTBUF2="$RAMDIR"/"$FILEID"-buf2
- INBUF2="$RAMDIR"/"$FILEID"-buf2.gray
- OUTBUF3="$RAMDIR"/"$FILEID"-buf3
- SLIDEBUF="$RAMDIR"/"$FILEID"-buf3.gray
- WIDTH=$2
- HEIGHT=$3
- OVER=$4
- ROTATE=$5
- BITS=$6
- if [ "$FILEEXT" = "pdf" ]
- then
- PAGES=`pdfinfo "$FULLNAME" | grep "Pages:\s*" | grep -o [0-9]*`
- elif [ "$FILEEXT" = "djvu" ]
- then
- PAGES=`djvm -l "$FULLNAME" | grep "PAGE" -c`
- else
- echo "Format not supported"
- exit 1
- fi
- echo "Starting $FILENAME"
- echo "Type: $FILEEXT"
- echo "Checksum: $FILEID"
- echo "Width: $WIDTH"
- echo "Height: $HEIGHT"
- echo "Overlapping: $OVER"
- echo "Rotate: $ROTATE"
- echo "Bit-depth: $BITS"
- echo "Pages: $PAGES"
- PAGE=0
- SLIDE=-1
- touch "$OUTBUF3"
- while true
- do
- # import
- if [ "$PAGE" -lt "$PAGES" ]
- then
- PAGE=$(( $PAGE+1 ))
- if [ "$FILEEXT" = "pdf" ]
- then
- pdftoppm -gray -r 300 -f "$PAGE" -l "$PAGE" "$FULLNAME" >"$OUTBUF1" && echo "$FILENAME >> Page $PAGE" &
- elif [ "$FILEEXT" = "djvu" ]
- then
- ddjvu -format=pgm -scale=300 -page=$PAGE "$FULLNAME" >"$OUTBUF1" && echo "$FILENAME >>Page $PAGE" &
- fi
- else
- rm "$OUTBUF1" &>/dev/null
- fi
- #process
- if [ -e "$INBUF1" ]
- then
- convert "$INBUF1" -fuzz 1% -trim +repage -resize $WIDTH -bordercolor white -border 0x10 -bordercolor black -border 0x5 -type GrayScale -depth 8 gray:"$OUTBUF2" &
- else
- rm "$OUTBUF2" &>/dev/null
- fi
- # export
- if [ -e "$INBUF2" ]
- then
- :>"$OUTBUF3"
- ITER=-1
- while true
- do
- ITER=$(( $ITER+1 ))
- SKIP=$(( $ITER*$(($HEIGHT-$OVER)) ))
- dd status=noxfer if="$INBUF2" skip=$SKIP count=$HEIGHT bs=$WIDTH of="$SLIDEBUF" &>/dev/null
- if [ `stat -c %s "$SLIDEBUF"` -eq $(($WIDTH*$HEIGHT)) ]
- then
- SLIDE=$(( $SLIDE+1 ))
- convert -size $(($WIDTH))x$(($HEIGHT)) -depth 8 "$SLIDEBUF" -rotate $ROTATE +repage -strip -type GrayScale -depth $BITS -compress Zip -quality 100 "$RESDIR"/$(printf %04d $SLIDE).pdf && echo "$FILENAME ++ Slide $SLIDE"
- else
- cat "$SLIDEBUF" >"$OUTBUF3"
- break
- fi
- done
- fi
- wait
- # read results
- if [ -e "$OUTBUF1" ]
- then
- cat "$OUTBUF1" >"$INBUF1"
- else
- rm "$INBUF1" &>/dev/null
- fi
- cat "$OUTBUF3" >"$INBUF2"
- if [ -e "$OUTBUF2" ]
- then
- cat "$OUTBUF2" >>"$INBUF2"
- fi
- # exit
- if [[ ! -e "$OUTBUF1" ]] && [[ ! -e "$OUTBUF2" ]]
- then
- # last slide - weird approach
- if [[ -s $INBUF2 ]]
- then
- SLIDE=$(( $SLIDE+1 ))
- convert -size $(($WIDTH))x$(($HEIGHT)) -depth 8 "$SLIDEBUF" -rotate $ROTATE +repage -strip -type GrayScale -depth $BITS -compress Zip -quality 100 "$RESDIR"/$(printf %04d $SLIDE).pdf && echo "$FILENAME ++ Slide $SLIDE"
- fi
- pdftk "$RESDIR"/*.pdf cat output $FILENAME.pdf
- rm -r $RESDIR &>/dev/null
- rm "$RAMDIR"/* &>/dev/null
- umount $RAMDIR
- echo "Done!"
- date
- exit 0
- fi
- done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement