From 344afb0dc211535ddced76aeed6b9d5ae7b30eb9 Mon Sep 17 00:00:00 2001 From: Gustavo Neves Date: Tue, 21 Feb 2017 05:41:36 -0300 Subject: [PATCH] v1.2.7 - Adds the possibility to use imagemagick with the -i parameter; fix an issue that could occur before when the MediaBox (or BBox) was not at the beggining of the line; tested with filename with spaces both with and without the -i parameter --- pdfScale.sh | 79 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 66 insertions(+), 13 deletions(-) diff --git a/pdfScale.sh b/pdfScale.sh index fb9f4a0..7cf811f 100755 --- a/pdfScale.sh +++ b/pdfScale.sh @@ -11,7 +11,7 @@ # And: https://gist.github.com/MichaelJCole/86e4968dbfc13256228a -VERSION="1.2.1" +VERSION="1.2.7" SCALE="0.95" # scaling factor (0.95 = 95%, e.g.) VERBOSE=0 # verbosity Level BASENAME="$(basename $0)" # simplified name of this script @@ -23,6 +23,13 @@ LC_ALL="C" # Some languages use , as decimal token LC_CTYPE="C" LC_NUMERIC="C" +TRUE=0 # Silly stuff +FALSE=1 + +USEIMGMGK=$FALSE # ImageMagick Flag, will use identify if true + + +# Prints version printVersion() { if [[ $1 -eq 2 ]]; then echo >&2 "$BASENAME v$VERSION" @@ -31,10 +38,12 @@ printVersion() { fi } + +# Prints help info printHelp() { printVersion echo " -Usage: $BASENAME [-v] [-s ] [outfile.pdf] +Usage: $BASENAME [-v] [-s ] [-i] [outfile.pdf] $BASENAME -h $BASENAME -V @@ -43,6 +52,7 @@ 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, defaults false -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 @@ -68,6 +78,8 @@ Examples: " } + +# Prints usage info usage() { printVersion 2 echo >&2 "Usage: $BASENAME [-v] [-s ] [outfile.pdf]" @@ -75,6 +87,8 @@ usage() { exit 1 } + +# Prints Verbose information vprint() { [[ $VERBOSE -eq 0 ]] && return 0 timestamp="" @@ -82,6 +96,8 @@ vprint() { echo "$timestamp$1" } + +# Prints dependency information and aborts execution printDependency() { printVersion 2 echo >&2 $'\n'"ERROR! You need to install the package '$1'"$'\n' @@ -92,6 +108,8 @@ printDependency() { exit 3 } + +# Parses and validates the scaling factor parseScale() { if ! [[ -n "$1" && "$1" =~ ^-?[0-9]*([.][0-9]+)?$ && (($1 > 0 )) ]] ; then echo >&2 "Invalid factor: $1" @@ -103,6 +121,19 @@ parseScale() { } +# Gets page size using imagemagick's identify +getPageSizeImagemagick() { + # get data from image magick + local identify="$("$IDBIN" -format '%[fx:w] %[fx:h]BREAKME' "$INFILEPDF" 2>/dev/null)" + + identify="${identify%%BREAKME*}" # get page size only for 1st page + identify=($identify) # make it an array + PGWIDTH=${identify[0]} # assign + PGHEIGHT=${identify[1]} +} + + +# Gets page size using cat and grep getPageSize() { # get MediaBox info from PDF file using cat and grep, these are all possible # /MediaBox [0 0 595 841] @@ -110,11 +141,13 @@ getPageSize() { # /MediaBox[ 0 0 595.28 841.89 ] # Get MediaBox data if possible - local mediaBox="$(cat "$INFILEPDF" | grep -a '/MediaBox')" + local mediaBox="$(cat "$INFILEPDF" | grep -a '/MediaBox' | head -n1)" + mediaBox="${mediaBox##*/MediaBox}" # If no MediaBox, try BBox if [[ -z $mediaBox ]]; then - mediaBox="$(cat "$INFILEPDF" | grep -a '/BBox')" + mediaBox="$(cat "$INFILEPDF" | grep -a '/BBox' | head -n1)" + mediaBox="${mediaBox##*/BBox}" fi # No page size data available @@ -134,22 +167,20 @@ getPageSize() { mbCount=${#mediaBox[@]} # array size # sanity - if [[ $mbCount -lt 5 ]]; then + if [[ $mbCount -lt 4 ]]; then echo "Error when reading the page size!" echo "The page size information is invalid!" exit 16 fi # we are done - PGWIDTH=$(printf '%.0f' "${mediaBox[3]}") # Get Round Width - PGHEIGHT=$(printf '%.0f' "${mediaBox[4]}") # Get Round Height - - vprint " Width: $PGWIDTH postscript-points" - vprint " Height: $PGHEIGHT postscript-points" + PGWIDTH=$(printf '%.0f' "${mediaBox[2]}") # Get Round Width + PGHEIGHT=$(printf '%.0f' "${mediaBox[3]}") # Get Round Height } + # Parse options -while getopts ":vhVs:" o; do +while getopts ":vihVs:" o; do case "${o}" in v) ((VERBOSE++)) @@ -165,6 +196,9 @@ while getopts ":vhVs:" o; do s) parseScale ${OPTARG} ;; + i) + USEIMGMGK=$TRUE + ;; *) usage ;; @@ -179,24 +213,34 @@ shift $((OPTIND-1)) #Intro message vprint "$(basename $0) v$VERSION - Verbose execution" + # Dependencies -vprint "Checking dependencies" +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 + vprint "Checking for imagemagick's identify" + command -v identify >/dev/null 2>&1 || printDependency 'imagemagick' +fi + # Get dependency binaries GSBIN=$(which gs 2>/dev/null) BCBIN=$(which bc 2>/dev/null) +IDBIN=$(which identify 2>/dev/null) + # Verbose scale info vprint " Scale factor: $SCALE" + # Validate args [[ $# -lt 1 ]] && { usage; exit 1; } INFILEPDF="$1" [[ "$INFILEPDF" =~ ^..*\.pdf$ ]] || { usage; exit 2; } vprint " Input file: $INFILEPDF" + # Parse output filename if [[ -z $2 ]]; then OUTFILEPDF="${INFILEPDF%.pdf}.SCALED.pdf" @@ -205,8 +249,16 @@ else fi vprint " Output file: $OUTFILEPDF" + # Set PGWIDTH and PGHEIGHT -getPageSize +if [[ $USEIMGMGK -eq $TRUE ]]; then + getPageSizeImagemagick +else + getPageSize +fi +vprint " Width: $PGWIDTH postscript-points" +vprint " Height: $PGHEIGHT postscript-points" + # Compute translation factors (to center page. XTRANS=$(echo "scale=6; 0.5*(1.0-$SCALE)/$SCALE*$PGWIDTH" | "$BCBIN") @@ -214,6 +266,7 @@ YTRANS=$(echo "scale=6; 0.5*(1.0-$SCALE)/$SCALE*$PGHEIGHT" | "$BCBIN") vprint " Translation X: $XTRANS" vprint " Translation Y: $YTRANS" + # Do it. "$GSBIN" \ -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER \