|
|
@@ -0,0 +1,391 @@
|
|
|
+#!/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 $$
|
|
|
+
|
|
|
+ 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=1 }{ 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() {
|
|
|
+
|
|
|
+# 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"
|
|
|
+ convert ${USE_DINNORM} $( find $$ -iname '*.*g' | sed 's/ /\\ /g' | sort -n | paste -sd\ ) "${FILE%\.*}_${PictureAverage}.pdf"
|
|
|
+
|
|
|
+ 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 CSIZE <<< $(yad --width=300 --height=100 --form --separator=" " --center --title="Field Optionen" --form --field="Rotate pictures:CHK" TRUE --field="Compress pdf:CHK" FALSE --field="Size":CB 'auto!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
|
|
|
+
|