From 85efdbaaa20b468bf58490954139caa9c1e84071 Mon Sep 17 00:00:00 2001 From: Gustavo Neves Date: Wed, 22 Feb 2017 02:45:13 -0300 Subject: [PATCH] Mostly working with the new adaptive mode, need to finish and test pdfinfo mode --- pdfScale.sh | 209 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 175 insertions(+), 34 deletions(-) diff --git a/pdfScale.sh b/pdfScale.sh index e45ec1e..66dbe99 100755 --- a/pdfScale.sh +++ b/pdfScale.sh @@ -24,7 +24,7 @@ ################################################### -VERSION="1.4.1" +VERSION="1.4.3" SCALE="0.95" # scaling factor (0.95 = 95%, e.g.) VERBOSE=0 # verbosity Level BASENAME="$(basename $0)" # simplified name of this script @@ -36,7 +36,7 @@ IDBIN="" # Identify Binary PDFINFOBIN="" # PDF Info Binary MDLSBIN="" # MacOS mdls binary -OSNAME="$(uname 2>/dev/null)" # Check were we are running +OSNAME="$(uname 2>/dev/null)" # Check where we are running LC_MEASUREMENT="C" # To make sure our numbers have .decimals LC_ALL="C" # Some languages use , as decimal token @@ -78,15 +78,23 @@ Parameters: Use twice for even more information -h Print this help to screen and exits -V Prints version to screen and exits - -i Use imagemagick to get page size, - instead of postscript method + -m Force a mode of page size detection. + Will disable the Adaptive Mode. -c Use cat + grep to get page size, instead of postscript method -s Changes the scaling factor, defaults to 0.95 MUST be a number bigger than zero. Eg. -s 0.8 for 80% of the original size +Modes: + c, cat+grep Forces the use of the cat + grep method + m, mdls Forces the use of MacOS Quartz mdls + p, pdfinfo Forces the use of Linux PdfInfo + i, identify Forces the use of ImageMagick's Identify + Notes: + - Page size detection will try different modes until it gets + a page size, or you can force a mode with -m 'mode' - Options must be passed before the file names to be parsed - The output filename is optional. If no file name is passed the output file will have the same name/destination of the @@ -102,7 +110,7 @@ Examples: $BASENAME myPdfFile.pdf myScaledPdf $BASENAME -v -v myPdfFile.pdf $BASENAME -s 0.85 myPdfFile.pdf myScaledPdf.pdf - $BASENAME -i -s 0.80 -v myPdfFile.pdf + $BASENAME -m pdfinfo -s 0.80 -v myPdfFile.pdf $BASENAME -v -v -s 0.7 myPdfFile.pdf $BASENAME -h " @@ -151,10 +159,69 @@ parseScale() { } +# Parse a forced mode of operation +parseMode() { + if [[ -z $1 ]]; then + echo "Mode is empty, please specify the desired mode" + echo "Falling back to adaptive mode!" + ADAPTIVEMODE=$TRUE + MODE="" + return $FALSE + fi + + if [[ $1 = 'c' || $1 = 'catgrep' || $1 = 'cat+grep' || $1 = 'CatGrep' || $1 = 'C' ]]; then + ADAPTIVEMODE=$FALSE + MODE="CATGREP" + return $TRUE + elif [[ $1 = 'i' || $1 = 'imagemagick' || $1 = 'identify' || $1 = 'ImageMagick' || $1 = 'Identify' || $1 = 'I' ]]; then + ADAPTIVEMODE=$FALSE + MODE="IDENTIFY" + return $TRUE + elif [[ $1 = 'm' || $1 = 'mdls' || $1 = 'MDLS' || $1 = 'quartz' || $1 = 'mac' || $1 = 'M' ]]; then + ADAPTIVEMODE=$FALSE + MODE="MDLS" + return $TRUE + elif [[ $1 = 'p' || $1 = 'pdfinfo' || $1 = 'PDFINFO' || $1 = 'PdfInfo' || $1 = 'P' ]]; then + ADAPTIVEMODE=$FALSE + MODE="PDFINFO" + return $TRUE + else + echo "Invalid mode: $1" + echo "Falling back to adaptive mode!" + ADAPTIVEMODE=$TRUE + MODE="" + return $FALSE + fi + + return $FALSE +} + + # Gets page size using imagemagick's identify getPageSizeImagemagick() { + # Sanity + if [[ ! -f $IDBIN && $ADAPTIVEMODE = $FALSE ]]; then + echo "Error! ImageMagick's Identify was not found!" + echo "Make sure you installed ImageMagick and have identify on your \$PATH" + echo "Aborting! You may want to try the adaptive mode." + exit 15 + elif [[ ! -f $IDBIN && $ADAPTIVEMODE = $TRUE ]]; then + return $FALSE + fi + # get data from image magick local identify="$("$IDBIN" -format '%[fx:w] %[fx:h]BREAKME' "$INFILEPDF" 2>/dev/null)" + # No page size data available + + if [[ -z $identify && $ADAPTIVEMODE = $FALSE ]]; then + echo "Error when reading input file!" + echo "Could not determine the page size!" + echo "ImageMagicks's Identify returned an empty string!" + echo "Aborting! You may want to try the adaptive mode." + exit 15 + elif [[ -z $identify && $ADAPTIVEMODE = $TRUE ]]; then + return $FALSE + fi identify="${identify%%BREAKME*}" # get page size only for 1st page identify=($identify) # make it an array @@ -165,33 +232,79 @@ getPageSizeImagemagick() { # Gets page size using Mac Quarts mdls getPageSizeMdls() { - [[ ! $OSNAME = "Darwin" ]] && return - # get data from image magick + # Sanity + if [[ ! -f $MDLSBIN && $ADAPTIVEMODE = $FALSE ]]; then + echo "Error! Mac Quartz mdls was not found!" + echo "Are you even trying this on a Mac?" + echo "Aborting! You may want to try the adaptive mode." + exit 15 + elif [[ ! -f $MDLSBIN && $ADAPTIVEMODE = $TRUE ]]; then + return $FALSE + fi + + # get data from mdls local identify="$("$MDLSBIN" -mdls -name kMDItemPageHeight -name kMDItemPageWidth "$INFILEPDF" 2>/dev/null)" + + if [[ -z $identify && $ADAPTIVEMODE = $FALSE ]]; then + echo "Error when reading input file!" + echo "Could not determine the page size!" + echo "Mac Quartz mdls returned an empty string!" + echo "Aborting! You may want to try the adaptive mode." + exit 15 + elif [[ -z $identify && $ADAPTIVEMODE = $TRUE ]]; then + return $FALSE + fi + + identify=${identify//$'\t'/ } # change tab to space identify=($identify) # make it an array - echo " - ${identify[0]} - ${identify[1] - ${identify[3]} - ${identify[4]}}" - PGWIDTH=$(printf '%.0f' "${identify[1]}") # assign - PGHEIGHT=$(printf '%.0f' "${identify[3]}") # assign + PGWIDTH=$(printf '%.0f' "${identify[2]}") # assign + PGHEIGHT=$(printf '%.0f' "${identify[5]}") # assign } -# Gets page size using Mac Quarts mdls +# Gets page size using Linux PdfInfo getPageSizePdfInfo() { + # Sanity + if [[ ! -f $PDFINFOBIN && $ADAPTIVEMODE = $FALSE ]]; then + echo "Error! Linux pdfinfo was not found!" + echo "Do you have pdfinfo installed and available on your \$PATH?" + echo "Aborting! You may want to try the adaptive mode." + exit 15 + elif [[ ! -f $PDFINFOBIN && $ADAPTIVEMODE = $TRUE ]]; then + return $FALSE + fi + # get data from image magick - local identify="$("$MDLSBIN" -mdls -name kMDItemPageHeight -name kMDItemPageWidth "$INFILEPDF" 2>/dev/null)" + local identify="$("$PDFINFOBIN" "$INFILEPDF" 2>/dev/null | grep -i 'Page size:' )" + + if [[ -z $identify && $ADAPTIVEMODE = $FALSE ]]; then + echo "Error when reading input file!" + echo "Could not determine the page size!" + echo "Linux PdfInfo returned an empty string!" + echo "Aborting! You may want to try the adaptive mode." + exit 15 + elif [[ -z $identify && $ADAPTIVEMODE = $TRUE ]]; then + return $FALSE + fi + + identify="${identify##*Page size:}" + + echo "-->$identify" identify=($identify) # make it an array - echo " - ${identify[0]} - ${identify[1] - ${identify[3]} - ${identify[4]}}" + echo " - ${identify[0]}" + echo " - ${identify[1]}" + echo " - ${identify[2]}" + echo " - ${identify[3]}" + echo " - ${identify[4]}" - PGWIDTH=$(printf '%.0f' "${identify[1]}") # assign - PGHEIGHT=$(printf '%.0f' "${identify[3]}") # assign + PGWIDTH=$(printf '%.0f' "${identify[0]}") # assign + PGHEIGHT=$(printf '%.0f' "${identify[2]}") # assign } - - # Gets page size using cat and grep getPageSizeCatGrep() { # get MediaBox info from PDF file using cat and grep, these are all possible @@ -237,24 +350,50 @@ getPageSizeCatGrep() { getPageSize() { - vprint "Detecting page size with cat+grep method" + if [[ $ADAPTIVEMODE = $FALSE ]]; then + vprint " Adaptive mode: Disabled" + if [[ $MODE = "CATGREP" ]]; then + vprint " Method: Cat + Grep" + getPageSizeCatGrep + elif [[ $MODE = "MDLS" ]]; then + vprint " Method: Mac Quartz mdls" + getPageSizeMdls + elif [[ $MODE = "PDFINFO" ]]; then + vprint " Method: Linux PdfInfo" + getPageSizePdfInfo + elif [[ $MODE = "IDENTIFY" ]]; then + vprint " Method: ImageMagick's Identify" + getPageSizeImagemagick + else + echo "Error! Invalid Mode: $MODE" + echo "Aborting execution..." + exit 20 + fi + return $TRUE + fi + + vprint " Adaptive mode: Enabled" + vprint " Method: Cat + Grep" getPageSizeCatGrep if [[ -z $PGWIDTH && -z $PGHEIGHT ]]; then - vprint " -> method failed!" + vprint " Failed" if [[ $OSNAME = "Darwin" ]]; then - vprint "Detecting page size with Mac Quartz mdls" + vprint " Method: Mac Quartz mdls" getPageSizeMdls else - vprint "Detecting page size with Linux pdfinfo" + vprint " Method: Linux PdfInfo" getPageSizePdfInfo fi fi + if [[ -z $PGWIDTH && -z $PGHEIGHT ]]; then - vprint " -> method failed!" - vprint " Detecting page size with ImageMagick's identify" + vprint " Failed" + vprint " Method: ImageMagick's Identify" getPageSizeImagemagick fi + if [[ -z $PGWIDTH && -z $PGHEIGHT ]]; then + vprint " Failed" echo "Error when detecting PDF paper size!" echo "All methods of detection failed" exit 17 @@ -262,8 +401,11 @@ getPageSize() { } + Input file: ../input-nup.pdf +Output file: ../input-nup.SCALED.pdf + # Parse options -while getopts ":vichVs:" o; do +while getopts ":vhVs:m:" o; do case "${o}" in v) ((VERBOSE++)) @@ -279,13 +421,8 @@ while getopts ":vichVs:" o; do s) parseScale ${OPTARG} ;; - i) - USEIMGMGK=$TRUE - USECATGREP=$FALSE - ;; - c) - USECATGREP=$TRUE - USEIMGMGK=$FALSE + m) + parseMode ${OPTARG} ;; *) usage @@ -306,16 +443,20 @@ vprint "$(basename $0) v$VERSION - Verbose execution" vprint "Checking for ghostscript and bcmath" command -v gs >/dev/null 2>&1 || printDependency 'ghostscript' command -v bc >/dev/null 2>&1 || printDependency 'bc' -if [[ $USEIMGMGK -eq $TRUE ]]; then +if [[ $MODE = "IDENTIFY" ]]; then vprint "Checking for imagemagick's identify" command -v identify >/dev/null 2>&1 || printDependency 'imagemagick' - IDBIN=$(which identify 2>/dev/null) +fi +if [[ $MODE = "PDFINFO" ]]; then + vprint "Checking for pdfinfo" + command -v pdfinfo >/dev/null 2>&1 || printDependency 'pdfinfo' fi # Get dependency binaries GSBIN="$(which gs 2>/dev/null)" BCBIN="$(which bc 2>/dev/null)" +IDBIN=$(which identify 2>/dev/null) if [[ $OSNAME = "Darwin" ]]; then MDLSBIN="$(which mdls 2>/dev/null)" else @@ -342,7 +483,7 @@ else fi vprint " Output file: $OUTFILEPDF" -getPageSizeMdls +getPageSize # Set PGWIDTH and PGHEIGHT #if [[ $USEIMGMGK -eq $TRUE ]]; then