#!/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