all2pdf_yed 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. #!/usr/bin/env bash
  2. ## https://de.wikipedia.org/wiki/Comic-Book-Format
  3. ## https://www.din-formate.de/reihe-a-din-groessen-mm-pixel-dpi.html
  4. ## https://www.ihre-ideenfabrik.de/sp_faq/din-formate/
  5. title="compress_pdf "$version""
  6. conversion="Compress files.."
  7. end="Complete :P"
  8. ## if auto is choosen for size PictureAverage is limited to MaxPictureAverage
  9. MaxPictureAverage=1000
  10. ## 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
  11. ## zenity --list --checklist --text 'Select the interface to be used:' --column 'Select...' --column 'Interface Name' FALSE
  12. ## zenity --list --checklist --text 'Select options:' --column 'Select' --column 'Options' 'rotate' 'autorotate pictures' 'compress' 'compress after convert'
  13. #=== FUNCTION ================================================================
  14. # NAME: chooseDPI
  15. # DESCRIPTION:
  16. #===============================================================================
  17. chooseDPI() {
  18. while [ "$DPI" == 0 ]
  19. do
  20. #DPI=`zenity --list --title="$title" --text="Choose DPI" --width=680 --height=270 --column="Value" --column="DPI" 72 72 150 "150 (default)" 300 300`
  21. DPI=`zenity --list --title="$title" --text="Choose DPI" --width=100 --height=270 --column="DPI" 72 150 300 noChange`
  22. [ $? -ne 0 ] && exit 2
  23. done
  24. }
  25. #=== FUNCTION ================================================================
  26. # NAME: chooseDinSize
  27. # DESCRIPTION: create ssh tunnel to application server
  28. #===============================================================================
  29. chooseDinSize() {
  30. while [ ! "$DINNORM" ]
  31. do
  32. # DIN_A3="`echo \"scale=0; \${DPI}*11.693333333/1\" | bc -l`x`echo \"scale=0; \${DPI}*16.536666667/1\" | bc -l`"
  33. # DIN_A4="`echo \"scale=0; \${DPI}*8.266666667/1\" | bc -l`x`echo \"scale=0; \${DPI}*11.693333333/1\" | bc -l`"
  34. # DIN_A5="`echo \"scale=0; \${DPI}*5.826666667/1\" | bc -l`x`echo \"scale=0; \${DPI}*8.266666667/1\" | bc -l`"
  35. # 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 )
  36. 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`
  37. [ $? -ne 0 ] && exit 2
  38. done
  39. }
  40. #=== FUNCTION ================================================================
  41. # NAME: extractFile
  42. # DESCRIPTION:
  43. #===============================================================================
  44. function extractFile() {
  45. mkdir -p $$/magicktmp/
  46. case $(file --mime-type -b "${FILE}") in
  47. ## PDF
  48. application/pdf)
  49. pdfimages -j "${FILE}" $$/bild
  50. ;;
  51. ## CBR
  52. application/x-rar)
  53. unrar e -y "${FILE}" $$/
  54. ;;
  55. ## CBZ
  56. application/zip)
  57. unzip -j "${FILE}" -d $$/
  58. ;;
  59. ## directory
  60. inode/directory)
  61. cp -R "${FILE}"/* $$/
  62. ## remove trailing /
  63. FILE="${FILE%\/}"
  64. ;;
  65. *)
  66. FILETYP="unknown"
  67. exit 1
  68. ;;
  69. esac
  70. }
  71. #=== FUNCTION ================================================================
  72. # NAME: findExtractedPictures
  73. # DESCRIPTION: find extracted pictures
  74. #===============================================================================
  75. findExtractedPictures() {
  76. # extractedPictures=`${EXEC_FIND} | sed 's/ /\\ /g' | sort -n | paste -sd\ `
  77. extractedPictures=`find $$ -iname '*.*g' | sed 's/ /\\ /g' | sort -n | paste -sd\ `
  78. }
  79. #=== FUNCTION ================================================================
  80. # NAME: RotateAutoPage
  81. # DESCRIPTION: rotate images
  82. #===============================================================================
  83. RotateAutoPage() {
  84. while [ $# -gt 0 ]; do
  85. w=`identify -format "%[fx:w]" "$1"`
  86. h=`identify -format "%[fx:h]" "$1"`
  87. if [ $w -gt $h ]
  88. then
  89. convert "$1" -rotate 270 "$1"
  90. fi
  91. shift
  92. done
  93. }
  94. #=== FUNCTION ================================================================
  95. # NAME: convertPPMtoPNG
  96. # DESCRIPTION: convert *.ppm to png
  97. #===============================================================================
  98. convertPPMtoPNG() {
  99. convert $$/*.ppm $$/image%d.png 2>/dev/null && rm $$/*.ppm
  100. }
  101. #=== FUNCTION ================================================================
  102. # NAME: renameExtFiles
  103. # DESCRIPTION: rename 01.jpg 001.jpg ...
  104. #===============================================================================
  105. renameExtFiles() {
  106. # for counter in {01..99}; do
  107. # ## PID=678 -> test -f 678/89.* && mv 678/89.* 678/089.jpg
  108. # test -f $$/${counter}.* \
  109. # && mv $$/${counter}.* $$/0${counter}.${FILE##*.}
  110. ## find $$ -name "${counter}.*" | xargs
  111. # done
  112. # IFS=$'\n'
  113. counter=0
  114. PID=$$
  115. # for file in $(find $$ -type f -iname '*.*g' | sort -n )}
  116. # do
  117. # rename "${file}" $$/${counter}
  118. # counter=$(( ${counter} + 1 ))
  119. # done
  120. # find $$ -type f -iname \*.*g -print0 | xargs -IF -0 mv F /folder/to/destination/
  121. # ${EXEC_FIND} | sort -n | gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash
  122. # 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
  123. cd $$
  124. ## for cbr/cbz, cover.jpg need to be at the beginning of the pdf
  125. rename 's/cover/0000000/g' *
  126. find . -iname '*.*g' | sort --version-sort | gawk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash
  127. cd ..
  128. }
  129. #=== FUNCTION ================================================================
  130. # NAME: checkCorruptPictures
  131. # DESCRIPTION: Detect corrupt pictures
  132. #===============================================================================
  133. #checkCorruptPictures() {
  134. #
  135. # find . -iname *g" -o -iname "*f" -type f 2>/dev/null | xargs identify -verbose >/dev/null 2>&1; echo $?
  136. #
  137. #}
  138. #=== FUNCTION ================================================================
  139. # NAME: calculatePictureAverage
  140. # DESCRIPTION: calculate average from pictures weight
  141. #===============================================================================
  142. calculatePictureAverage() {
  143. count=0
  144. total=0
  145. # for file in $(ls $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F)
  146. # for file in $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F
  147. for file in ${extractedPictures}
  148. do
  149. if [ -f "${file}" ]; then
  150. i=`convert "${file}" -print "%w" /dev/null`
  151. total=$(echo 0${total}+$i | bc )
  152. ((count++))
  153. echo file=${file}
  154. # echo i=$i
  155. fi
  156. done
  157. # PictureAverage=`echo "scale=2; $total / $count" | bc`
  158. PictureAverage=$(($total / $count))
  159. ##
  160. [ ${PictureAverage} -gt ${MaxPictureAverage} ] && { echo "PictureAverage = ${PictureAverage}. Limit to ${MaxPictureAverage}" ; PictureAverage=${MaxPictureAverage} ; }
  161. }
  162. #=== FUNCTION ================================================================
  163. # NAME: createPDF
  164. # DESCRIPTION:
  165. #===============================================================================
  166. createPDF() {
  167. MAGICK_TEMPORARY_PATH="`dirname "$0"`"
  168. # convert -compress jpeg -resize !874x1240 -density 150x150 -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "${1%\.pdf}_${compression}.pdf"
  169. # [ "${DINSIZE}" != "nochange" ] && USE_DINSIZE="-resize !${DINSIZE} "
  170. [ "${DINNORM}" != "nochange" ] && USE_DINNORM="-page ${DINNORM}"
  171. [ "${DPI}" != "noChange" ] && USE_DPI="-density ${DPI}x${DPI} "
  172. echo PictureAverage=$PictureAverage
  173. #PictureAverage=1000
  174. echo PictureAverage=$PictureAverage
  175. USE_DINNORM="-resize ${PictureAverage}x -density 150x150"
  176. #USE_DINNORM="-resize 793x -density 150x150"
  177. # convert -compress jpeg -resize !${DINSIZE} -density ${DPI}x${DPI} -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "${FILE%\.*}_${DPI}_${DINNORM}.pdf"
  178. # convert -compress jpeg ${USE_DINNORM} ${USE_DPI} -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "${FILE%\.*}_${DPI}_${DINNORM}.pdf"
  179. # convert -compress jpeg ${USE_DINNORM} -density 28.350000000000001421x28.350000000000001421 -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "test.pdf"
  180. # convert -compress jpeg ${USE_DINNORM} -density 300x300 -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "test_300.pdf"
  181. # convert -compress jpeg ${USE_DINNORM} -density 150x150 -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "test_150.pdf"
  182. #### convert -compress jpeg ${USE_DINNORM} -density 30x30 -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "${FILE%\.*}_${DINNORM}.pdf"
  183. # mogrify ${USE_DINNORM} $(find $$ -type f -iname '*.*g' | sort -n | paste -sd\ )
  184. # convert ${USE_DINNORM} $(${EXEC_FIND} | sort -n | paste -sd\ ) "${FILE%\.*}_${DINNORM}222.pdf"
  185. ## file for file (slower)
  186. if [ "${WORKAROUND}" == "TRUE" ]
  187. then
  188. find $$ -iname '*.*g' | sed 's/ /\\ /g' | sort -n | while read file
  189. do
  190. convert \
  191. -define registry:temporary-path='$$/magicktmp/' \
  192. -compress jpeg \
  193. -quality 70 \
  194. -density 150x150 \
  195. -units PixelsPerInch \
  196. -resize ${PictureAverage}x \
  197. ${file} ${file}
  198. done
  199. convert $( find $$ -iname '*.*g' | sed 's/ /\\ /g' | sort -n | paste -sd\ ) "${FILE%\.*}_${PictureAverage}a.pdf"
  200. else
  201. # convert -define registry:temporary-path='$$/magicktmp/' ${USE_DINNORM} $( find $$ -iname '*.*g' | sed 's/ /\\ /g' | sort -n | paste -sd\ ) "${FILE%\.*}_${PictureAverage}.pdf"
  202. convert \
  203. -define registry:temporary-path='$$/magicktmp/' \
  204. -compress jpeg \
  205. -quality 70 \
  206. -density 150x150 \
  207. -units PixelsPerInch \
  208. -resize ${PictureAverage}x \
  209. $( find $$ -iname '*.*g' | sed 's/ /\\ /g' | sort -n | paste -sd\ ) \
  210. "${FILE%\.*}_${PictureAverage}a.pdf"
  211. # convert ${USE_DINNORM} $( find $$ -iname '*.*g' | sed 's/ /\\ /g' | sort -n | paste -sd\ ) "${FILE%\.*}_${PictureAverage}.pdf"
  212. fi
  213. NEWPDF="${FILE%\.*}_${PictureAverage}.pdf"
  214. #convert ${USE_DINNORM} $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "${FILE%\.*}_${DINNORM}.pdf"
  215. # convert ${USE_DINNORM} $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "${FILE%\.*}_${DINNORM}.pdf"
  216. ### convert ${USE_DINNORM} $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "${FILE%\.*}_${DINNORM}.pdf"
  217. # convert -compress jpeg ${USE_DINNORM} -density 10x10 -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "test_10.pdf"
  218. # convert -compress jpeg ${USE_DINNORM} -density 30x30 -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "test_3.pdf"
  219. # convert -compress jpeg ${USE_DINNORM} -units PixelsPerInch $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F "test_X.pdf"
  220. #${USE_DINSIZE}
  221. }
  222. #=== FUNCTION =======================f=========================================
  223. # NAME: compress_pdf
  224. # DESCRIPTION: compress pdf
  225. #===============================================================================
  226. compress_pdf() {
  227. ## compress pdf
  228. gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile="${*%\.pdf}-smaller.pdf" "${*%\.pdf}.pdf"
  229. }
  230. #=== FUNCTION =======================f=========================================
  231. # NAME: cleanup
  232. # DESCRIPTION: delete tmp files
  233. #===============================================================================
  234. cleanup() {
  235. rm -R $$/
  236. }
  237. #=== Scriptablauf ================================================================
  238. #
  239. #
  240. #===================================================================================
  241. #chooseDPI
  242. ## chooseDinSize
  243. #chooseDinSize
  244. FILES=("$@")
  245. echo ${#FILES[@]}
  246. #printf '%s\n' "${FILES[@]}"
  247. SAVEIFS=$IFS
  248. [ ${#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."`)
  249. IFS=$SAVEIFS
  250. #read ROTATE COMPRESS <<< $(yad --width=300 --height=100 --center --title="Field Optionen" --form --separator=" " --field="Rotate pictures:CHK" TRUE --field="Compress pdf:CHK")
  251. 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' )
  252. echo "aa=$ROTATE bb=$COMPRESS cc=$CSIZE"
  253. ## if size is choosen ...
  254. [ "${CSIZE}" != "auto" ] && PictureAverage="${CSIZE}" || PictureAverage=0
  255. #COUNT_FILES=`echo $FILES | wc -w`
  256. printf '%s\n' "${FILES[@]}"
  257. #for (( i=0; i<${#FILES[@]}; i++ )); do
  258. #echo "${FILES[$i]}" ; done
  259. #(while [ ${COUNT_FILES} ] -gt 0 ]; do
  260. #(for FILE in ${FILES}; do
  261. #(for (( i=0; i<${#FILES[@]}; i++ )); do
  262. (for FILE in "${FILES[@]}"; do
  263. echo FILE=$FILE
  264. ## do not change!
  265. # FILE=$1
  266. DPI=0
  267. EXEC_FIND="find $$ -iname '*.*g'"
  268. ## progress bar
  269. # echo $(( 100/${#FILES[@]}*(${#FILES[@]}-$#) ))
  270. echo "# Extraxt pictures from pdf... (1/4) \n$1 (File: $((${#FILES[@]}-$#+1))/${#FILES[@]})"
  271. ## skip script itself
  272. [ "${FILE}" == "`basename "$0"`" ] && { shift; COUNT_FILES=$(( ${COUNT_FILES}-1 )); continue; }
  273. ## extract images from file
  274. extractFile
  275. ## convert files if needed
  276. convertPPMtoPNG
  277. ## rename extracted images
  278. renameExtFiles
  279. ## find extracted pictures
  280. findExtractedPictures
  281. ## rotate images
  282. #RotateAutoPage $$/*g $$/*G $$/*/*g $$/*/*G $$/*/*f $$/*/*F
  283. [ "${ROTATE}" == "TRUE" ] && RotateAutoPage ${extractedPictures}
  284. #find $$ -type f -regex '.*[gfGF]$' | while read file;
  285. #do
  286. # RotateAutoPage "${file}"
  287. #done
  288. ## calculate picture average if auto is choosen
  289. [ "${CSIZE}" == "auto" ] && calculatePictureAverage
  290. ## create new PDF
  291. echo "# Create new pdf... (3/4) \n$1 (File: $((${#FILES[@]}-$#+1))/${#FILES[@]})"
  292. createPDF
  293. [ "${COMPRESS}" == "TRUE" ] && compress_pdf ${NEWPDF}
  294. ## delete tmp files
  295. cleanup
  296. shift
  297. done
  298. echo "# "$end"" ; sleep 1
  299. ) |
  300. #### Barra de progrés ####
  301. zenity --progress --percentage=0 --title="$title" --text="$conversion" --pulsate --width=400