| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427 |
- #!/usr/bin/env bash
- ## https://de.wikipedia.org/wiki/Comic-Book-Format
- ## https://www.din-formate.de/reihe-a-din-groessen-mm-pixel-dpi.html
- ## https://www.ihre-ideenfabrik.de/sp_faq/din-formate/
- title="compress_pdf "$version""
- conversion="Compress files.."
- end="Complete :P"
- ## if auto is choosen for size PictureAverage is limited to MaxPictureAverage
- MaxPictureAverage=1000
- ## zenity --forms --text "Formulário com lista de duas colunas" --add-entry "Nome" --add-list="Lista dupla" --column-values "Núm|Descritivo" --list-values="1|Primeira Linha|2|Segunda Linha|3|Terceira linha|" --show-header
- ## zenity --list --checklist --text 'Select the interface to be used:' --column 'Select...' --column 'Interface Name' FALSE
- ## zenity --list --checklist --text 'Select options:' --column 'Select' --column 'Options' 'rotate' 'autorotate pictures' 'compress' 'compress after convert'
- #=== FUNCTION ================================================================
- # NAME: chooseDPI
- # DESCRIPTION:
- #===============================================================================
- chooseDPI() {
- while [ "$DPI" == 0 ]
- do
- #DPI=`zenity --list --title="$title" --text="Choose DPI" --width=680 --height=270 --column="Value" --column="DPI" 72 72 150 "150 (default)" 300 300`
- DPI=`zenity --list --title="$title" --text="Choose DPI" --width=100 --height=270 --column="DPI" 72 150 300 noChange`
- [ $? -ne 0 ] && exit 2
- done
- }
- #=== FUNCTION ================================================================
- # NAME: chooseDinSize
- # DESCRIPTION: create ssh tunnel to application server
- #===============================================================================
- chooseDinSize() {
- while [ ! "$DINNORM" ]
- do
- # DIN_A3="`echo \"scale=0; \${DPI}*11.693333333/1\" | bc -l`x`echo \"scale=0; \${DPI}*16.536666667/1\" | bc -l`"
- # DIN_A4="`echo \"scale=0; \${DPI}*8.266666667/1\" | bc -l`x`echo \"scale=0; \${DPI}*11.693333333/1\" | bc -l`"
- # DIN_A5="`echo \"scale=0; \${DPI}*5.826666667/1\" | bc -l`x`echo \"scale=0; \${DPI}*8.266666667/1\" | bc -l`"
- # read DINNORM DINSIZE <<< $(zenity --list --print-column=ALL --separator=' ' --title="$title" --text="Choose Size" --width=680 --height=270 --column="Din Norm" --column="Format" NoChange nochange A3 $DIN_A3 A4 $DIN_A4 A5 $DIN_A5 )
- DINNORM=`zenity --list --print-column=ALL --separator=' ' --title="$title" --text="Choose Din Norm" --width=250 --height=270 --column="Din Norm" nochange A3 A4 A5 A6`
- [ $? -ne 0 ] && exit 2
- done
- }
- #=== FUNCTION ================================================================
- # NAME: extractFile
- # DESCRIPTION:
- #===============================================================================
- function extractFile() {
- mkdir -p $$/magicktmp/
- case $(file --mime-type -b "${FILE}") in
- ## PDF
- application/pdf)
- pdfimages -j "${FILE}" $$/bild
- ;;
- ## CBR
- application/x-rar)
- unrar e -y "${FILE}" $$/
- ;;
- ## CBZ
- application/zip)
- unzip -j "${FILE}" -d $$/
- ;;
- ## directory
- inode/directory)
- cp -R "${FILE}"/* $$/
- ## remove trailing /
- FILE="${FILE%\/}"
- ;;
- *)
- FILETYP="unknown"
- exit 1
- ;;
- esac
- }
- #=== FUNCTION ================================================================
- # NAME: findExtractedPictures
- # DESCRIPTION: find extracted pictures
- #===============================================================================
- findExtractedPictures() {
- # extractedPictures=`${EXEC_FIND} | sed 's/ /\\ /g' | sort -n | paste -sd\ `
- extractedPictures=`find $$ -iname '*.*g' | sed 's/ /\\ /g' | sort -n | paste -sd\ `
- }
- #=== FUNCTION ================================================================
- # NAME: RotateAutoPage
- # DESCRIPTION: rotate images
- #===============================================================================
- RotateAutoPage() {
- while [ $# -gt 0 ]; do
- w=`identify -format "%[fx:w]" "$1"`
- h=`identify -format "%[fx:h]" "$1"`
- if [ $w -gt $h ]
- then
- convert "$1" -rotate 270 "$1"
- fi
- shift
- done
- }
- #=== FUNCTION ================================================================
- # NAME: convertPPMtoPNG
- # DESCRIPTION: convert *.ppm to png
- #===============================================================================
- convertPPMtoPNG() {
- convert $$/*.ppm $$/image%d.png 2>/dev/null && rm $$/*.ppm
- }
- #=== FUNCTION ================================================================
- # NAME: renameExtFiles
- # DESCRIPTION: rename 01.jpg 001.jpg ...
- #===============================================================================
- renameExtFiles() {
- # for counter in {01..99}; do
- # ## PID=678 -> test -f 678/89.* && mv 678/89.* 678/089.jpg
- # test -f $$/${counter}.* \
- # && mv $$/${counter}.* $$/0${counter}.${FILE##*.}
- ## find $$ -name "${counter}.*" | xargs
- # done
- # IFS=$'\n'
- counter=0
- PID=$$
- # for file in $(find $$ -type f -iname '*.*g' | sort -n )}
- # do
- # rename "${file}" $$/${counter}
- # counter=$(( ${counter} + 1 ))
- # done
- # find $$ -type f -iname \*.*g -print0 | xargs -IF -0 mv F /folder/to/destination/
-
- # ${EXEC_FIND} | sort -n | gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash
- # find $$ -iname '*.*g' | sed 's/ /\\ /g' | sort -n | paste -sd\ | sort -n | gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash
- cd $$
- ## for cbr/cbz, cover.jpg need to be at the beginning of the pdf
- rename 's/cover/0000000/g' *
- find . -iname '*.*g' | sort --version-sort | gawk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash
- cd ..
- }
- #=== FUNCTION ================================================================
- # NAME: checkCorruptPictures
- # DESCRIPTION: Detect corrupt pictures
- #===============================================================================
- #checkCorruptPictures() {
- #
- # find . -iname *g" -o -iname "*f" -type f 2>/dev/null | xargs identify -verbose >/dev/null 2>&1; echo $?
- #
- #}
- #=== FUNCTION ================================================================
- # NAME: calculatePictureAverage
- # DESCRIPTION: calculate average from pictures weight
- #===============================================================================
- calculatePictureAverage() {
- count=0
- total=0
- # for file in $(ls $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F)
- # for file in $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F
- for file in ${extractedPictures}
- do
- if [ -f "${file}" ]; then
- i=`convert "${file}" -print "%w" /dev/null`
- total=$(echo 0${total}+$i | bc )
- ((count++))
- echo file=${file}
- # echo i=$i
- fi
- done
-
- # PictureAverage=`echo "scale=2; $total / $count" | bc`
- PictureAverage=$(($total / $count))
- ##
- [ ${PictureAverage} -gt ${MaxPictureAverage} ] && { echo "PictureAverage = ${PictureAverage}. Limit to ${MaxPictureAverage}" ; PictureAverage=${MaxPictureAverage} ; }
- }
- #=== FUNCTION ================================================================
- # NAME: createPDF
- # DESCRIPTION:
- #===============================================================================
- createPDF() {
- MAGICK_TEMPORARY_PATH="`dirname "$0"`"
- # convert -compress jpeg -resize !874x1240 -density 150x150 -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "${1%\.pdf}_${compression}.pdf"
- # [ "${DINSIZE}" != "nochange" ] && USE_DINSIZE="-resize !${DINSIZE} "
- [ "${DINNORM}" != "nochange" ] && USE_DINNORM="-page ${DINNORM}"
- [ "${DPI}" != "noChange" ] && USE_DPI="-density ${DPI}x${DPI} "
-
- echo PictureAverage=$PictureAverage
- #PictureAverage=1000
- echo PictureAverage=$PictureAverage
- USE_DINNORM="-resize ${PictureAverage}x -density 150x150"
- #USE_DINNORM="-resize 793x -density 150x150"
- # convert -compress jpeg -resize !${DINSIZE} -density ${DPI}x${DPI} -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "${FILE%\.*}_${DPI}_${DINNORM}.pdf"
- # convert -compress jpeg ${USE_DINNORM} ${USE_DPI} -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "${FILE%\.*}_${DPI}_${DINNORM}.pdf"
- # convert -compress jpeg ${USE_DINNORM} -density 28.350000000000001421x28.350000000000001421 -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "test.pdf"
- # convert -compress jpeg ${USE_DINNORM} -density 300x300 -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "test_300.pdf"
- # convert -compress jpeg ${USE_DINNORM} -density 150x150 -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "test_150.pdf"
- #### convert -compress jpeg ${USE_DINNORM} -density 30x30 -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "${FILE%\.*}_${DINNORM}.pdf"
- # mogrify ${USE_DINNORM} $(find $$ -type f -iname '*.*g' | sort -n | paste -sd\ )
- # convert ${USE_DINNORM} $(${EXEC_FIND} | sort -n | paste -sd\ ) "${FILE%\.*}_${DINNORM}222.pdf"
- ## file for file (slower)
- if [ "${WORKAROUND}" == "TRUE" ]
- then
- find $$ -iname '*.*g' | sed 's/ /\\ /g' | sort -n | while read file
- do
- convert \
- -define registry:temporary-path='$$/magicktmp/' \
- -compress jpeg \
- -quality 70 \
- -density 150x150 \
- -units PixelsPerInch \
- -resize ${PictureAverage}x \
- ${file} ${file}
- done
- convert $( find $$ -iname '*.*g' | sed 's/ /\\ /g' | sort -n | paste -sd\ ) "${FILE%\.*}_${PictureAverage}a.pdf"
- else
- # convert -define registry:temporary-path='$$/magicktmp/' ${USE_DINNORM} $( find $$ -iname '*.*g' | sed 's/ /\\ /g' | sort -n | paste -sd\ ) "${FILE%\.*}_${PictureAverage}.pdf"
- convert \
- -define registry:temporary-path='$$/magicktmp/' \
- -compress jpeg \
- -quality 70 \
- -density 150x150 \
- -units PixelsPerInch \
- -resize ${PictureAverage}x \
- $( find $$ -iname '*.*g' | sed 's/ /\\ /g' | sort -n | paste -sd\ ) \
- "${FILE%\.*}_${PictureAverage}a.pdf"
- # convert ${USE_DINNORM} $( find $$ -iname '*.*g' | sed 's/ /\\ /g' | sort -n | paste -sd\ ) "${FILE%\.*}_${PictureAverage}.pdf"
- fi
- NEWPDF="${FILE%\.*}_${PictureAverage}.pdf"
- #convert ${USE_DINNORM} $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "${FILE%\.*}_${DINNORM}.pdf"
- # convert ${USE_DINNORM} $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "${FILE%\.*}_${DINNORM}.pdf"
- ### convert ${USE_DINNORM} $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "${FILE%\.*}_${DINNORM}.pdf"
- # convert -compress jpeg ${USE_DINNORM} -density 10x10 -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "test_10.pdf"
- # convert -compress jpeg ${USE_DINNORM} -density 30x30 -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "test_3.pdf"
- # convert -compress jpeg ${USE_DINNORM} -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "test_X.pdf"
- #${USE_DINSIZE}
- }
- #=== FUNCTION =======================f=========================================
- # NAME: compress_pdf
- # DESCRIPTION: compress pdf
- #===============================================================================
- compress_pdf() {
-
- ## compress pdf
- gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile="${*%\.pdf}-smaller.pdf" "${*%\.pdf}.pdf"
- }
- #=== FUNCTION =======================f=========================================
- # NAME: cleanup
- # DESCRIPTION: delete tmp files
- #===============================================================================
- cleanup() {
-
- rm -R $$/
- }
- #=== Scriptablauf ================================================================
- #
- #
- #===================================================================================
- #chooseDPI
- ## chooseDinSize
- #chooseDinSize
- FILES=("$@")
- echo ${#FILES[@]}
- #printf '%s\n' "${FILES[@]}"
- SAVEIFS=$IFS
- [ ${#FILES[@]} -eq 0 ] && IFS=$'\n' FILES=(`yad --width=1000 --height=600 --file-selection --multiple --separator=$'\n' --title="Bitte Dateien auswählen" --text="Es wurde keine Datei als Parameter übermittelt. Bitte wählen."`)
- IFS=$SAVEIFS
- #read ROTATE COMPRESS <<< $(yad --width=300 --height=100 --center --title="Field Optionen" --form --separator=" " --field="Rotate pictures:CHK" TRUE --field="Compress pdf:CHK")
- read ROTATE COMPRESS WORKAROUND CSIZE <<< $(yad --width=300 --height=100 --form --separator=" " --center --title="Field Optionen" --form --field="Rotate pictures:CHK" TRUE --field="Compress pdf:CHK" FALSE --field="Workaround on oom crash:CHK" FALSE --field="Size":CB 'auto!1500!1200!1000!750!500!400!300' )
- echo "aa=$ROTATE bb=$COMPRESS cc=$CSIZE"
- ## if size is choosen ...
- [ "${CSIZE}" != "auto" ] && PictureAverage="${CSIZE}" || PictureAverage=0
- #COUNT_FILES=`echo $FILES | wc -w`
- printf '%s\n' "${FILES[@]}"
- #for (( i=0; i<${#FILES[@]}; i++ )); do
- #echo "${FILES[$i]}" ; done
- #(while [ ${COUNT_FILES} ] -gt 0 ]; do
- #(for FILE in ${FILES}; do
- #(for (( i=0; i<${#FILES[@]}; i++ )); do
- (for FILE in "${FILES[@]}"; do
- echo FILE=$FILE
- ## do not change!
- # FILE=$1
- DPI=0
- EXEC_FIND="find $$ -iname '*.*g'"
- ## progress bar
- # echo $(( 100/${#FILES[@]}*(${#FILES[@]}-$#) ))
- echo "# Extraxt pictures from pdf... (1/4) \n$1 (File: $((${#FILES[@]}-$#+1))/${#FILES[@]})"
- ## skip script itself
- [ "${FILE}" == "`basename "$0"`" ] && { shift; COUNT_FILES=$(( ${COUNT_FILES}-1 )); continue; }
- ## extract images from file
- extractFile
- ## convert files if needed
- convertPPMtoPNG
- ## rename extracted images
- renameExtFiles
- ## find extracted pictures
- findExtractedPictures
- ## rotate images
- #RotateAutoPage $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F
- [ "${ROTATE}" == "TRUE" ] && RotateAutoPage ${extractedPictures}
- #find $$ -type f -regex '.*[gfGF]$' | while read file;
- #do
- # RotateAutoPage "${file}"
- #done
- ## calculate picture average if auto is choosen
- [ "${CSIZE}" == "auto" ] && calculatePictureAverage
- ## create new PDF
- echo "# Create new pdf... (3/4) \n$1 (File: $((${#FILES[@]}-$#+1))/${#FILES[@]})"
- createPDF
- [ "${COMPRESS}" == "TRUE" ] && compress_pdf ${NEWPDF}
- ## delete tmp files
- cleanup
- shift
- done
- echo "# "$end"" ; sleep 1
- ) |
- #### Barra de progrés ####
- zenity --progress --percentage=0 --title="$title" --text="$conversion" --pulsate --width=400
|