Skip to content

Commit

Permalink
v1.2.1 Simpler and better page size parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
tavinus committed Feb 21, 2017
1 parent 93730c2 commit a86a4f8
Showing 1 changed file with 82 additions and 61 deletions.
143 changes: 82 additions & 61 deletions pdfScale.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
# And: https://gist.github.com/MichaelJCole/86e4968dbfc13256228a


VERSION="1.1.3"
VERSION="1.2.1"
SCALE="0.95" # scaling factor (0.95 = 95%, e.g.)
VERBOSE=0 # verbosity Level
BASENAME="$(basename $0)" # simplified name of this script
Expand All @@ -24,16 +24,16 @@ LC_CTYPE="C"
LC_NUMERIC="C"

printVersion() {
if [[ $1 -eq 2 ]]; then
echo >&2 "$BASENAME v$VERSION"
else
echo "$BASENAME v$VERSION"
fi
if [[ $1 -eq 2 ]]; then
echo >&2 "$BASENAME v$VERSION"
else
echo "$BASENAME v$VERSION"
fi
}

printHelp() {
printVersion
echo "
printVersion
echo "
Usage: $BASENAME [-v] [-s <factor>] <inFile.pdf> [outfile.pdf]
$BASENAME -h
$BASENAME -V
Expand Down Expand Up @@ -69,72 +69,86 @@ Examples:
}

usage() {
printVersion 2
echo >&2 "Usage: $BASENAME [-v] [-s <factor>] <inFile.pdf> [outfile.pdf]"
echo >&2 "Try: $BASENAME -h # for help"
exit 1
printVersion 2
echo >&2 "Usage: $BASENAME [-v] [-s <factor>] <inFile.pdf> [outfile.pdf]"
echo >&2 "Try: $BASENAME -h # for help"
exit 1
}

vprint() {
[[ $VERBOSE -eq 0 ]] && return 0
timestamp=""
[[ $VERBOSE -gt 1 ]] && timestamp="$(date +%Y-%m-%d:%H:%M:%S) | "
echo "$timestamp$1"
[[ $VERBOSE -eq 0 ]] && return 0
timestamp=""
[[ $VERBOSE -gt 1 ]] && timestamp="$(date +%Y-%m-%d:%H:%M:%S) | "
echo "$timestamp$1"
}

printDependency() {
printVersion 2
echo >&2 $'\n'"ERROR! You need to install the package '$1'"$'\n'
echo >&2 "Linux apt-get.: sudo apt-get install $1"
echo >&2 "Linux yum.....: sudo yum install $1"
echo >&2 "MacOS homebrew: brew install $1"
echo >&2 $'\n'"Aborting..."
exit 3
printVersion 2
echo >&2 $'\n'"ERROR! You need to install the package '$1'"$'\n'
echo >&2 "Linux apt-get.: sudo apt-get install $1"
echo >&2 "Linux yum.....: sudo yum install $1"
echo >&2 "MacOS homebrew: brew install $1"
echo >&2 $'\n'"Aborting..."
exit 3
}

parseScale() {
if ! [[ -n "$1" && "$1" =~ ^-?[0-9]*([.][0-9]+)?$ && (($1 > 0 )) ]] ; then
echo >&2 "Invalid factor: $1"
echo >&2 "The factor must be a floating point number greater than 0"
echo >&2 "Example: for 80% use 0.8"
exit 2
fi
SCALE=$1
if ! [[ -n "$1" && "$1" =~ ^-?[0-9]*([.][0-9]+)?$ && (($1 > 0 )) ]] ; then
echo >&2 "Invalid factor: $1"
echo >&2 "The factor must be a floating point number greater than 0"
echo >&2 "Example: for 80% use 0.8"
exit 2
fi
SCALE=$1
}


getPageSize() {
# get MediaBox info from PDF file using cat and grep, these are all possible
# /MediaBox [0 0 595 841]
# /MediaBox [ 0 0 595.28 841.89]
# /MediaBox[ 0 0 595.28 841.89 ]
local mediaBox="$(cat "$INFILEPDF" | grep -a '/MediaBox')" # done with externals
if [[ -z $mediaBox ]]; then
mediaBox="$(cat "$INFILEPDF" | grep -a '/BBox')" # if no mediaBox
fi
if [[ -z $mediaBox ]]; then
echo "Error when reading input file!"
echo "Could not determine the page size!"
echo "There is no MediaBox or BBox in the pdf document!"
echo "Aborting..."
exit 15
fi
#mediaBox="/MediaBox [0 0 595 841]"
#echo "mediaBox $mediaBox"
mediaBox="${mediaBox#*0 0 }"
#echo "mediaBox $mediaBox"
PGWIDTH=$(printf '%.0f' "${mediaBox%% *}") # Get Round Width
#echo "PGWIDTH $PGWIDTH"
mediaBox="${mediaBox#* }"
#echo "mediaBox $mediaBox"
PGHEIGHT="${mediaBox%%]*}" # Get value, may have spaces
#echo "PGHEIGHT $PGHEIGHT"
PGHEIGHT=$(printf '%.0f' "${PGHEIGHT%% *}") # Get Round Height
#echo "PGHEIGHT $PGHEIGHT"
vprint " Width: $PGWIDTH postscript-points"
vprint " Height: $PGHEIGHT postscript-points"
# get MediaBox info from PDF file using cat and grep, these are all possible
# /MediaBox [0 0 595 841]
# /MediaBox [ 0 0 595.28 841.89]
# /MediaBox[ 0 0 595.28 841.89 ]

# Get MediaBox data if possible
local mediaBox="$(cat "$INFILEPDF" | grep -a '/MediaBox')"

# If no MediaBox, try BBox
if [[ -z $mediaBox ]]; then
mediaBox="$(cat "$INFILEPDF" | grep -a '/BBox')"
fi

# No page size data available
if [[ -z $mediaBox ]]; then
echo "Error when reading input file!"
echo "Could not determine the page size!"
echo "There is no MediaBox or BBox in the pdf document!"
echo "Aborting..."
exit 15
fi

# remove chars [ and ]
mediaBox="${mediaBox//[}"
mediaBox="${mediaBox//]}"

mediaBox=($mediaBox) # make it an array
mbCount=${#mediaBox[@]} # array size

# sanity
if [[ $mbCount -lt 5 ]]; 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"
}

# Parse options
while getopts ":vhVs:" o; do
case "${o}" in
v)
Expand All @@ -158,16 +172,23 @@ while getopts ":vhVs:" o; do
done
shift $((OPTIND-1))



######### START EXECUTION

#Intro message
vprint "$(basename $0) v$VERSION - Verbose execution"

# Dependencies
vprint "Checking dependencies"
command -v gs >/dev/null 2>&1 || printDependency 'ghostscript'
command -v bc >/dev/null 2>&1 || printDependency 'bc'

# Get dependency binaries
GSBIN=$(which gs 2>/dev/null)
BCBIN=$(which bc 2>/dev/null)

# Verbose scale info
vprint " Scale factor: $SCALE"

# Validate args
Expand All @@ -178,9 +199,9 @@ vprint " Input file: $INFILEPDF"

# Parse output filename
if [[ -z $2 ]]; then
OUTFILEPDF="${INFILEPDF%.pdf}.SCALED.pdf"
OUTFILEPDF="${INFILEPDF%.pdf}.SCALED.pdf"
else
OUTFILEPDF="${2%.pdf}.pdf"
OUTFILEPDF="${2%.pdf}.pdf"
fi
vprint " Output file: $OUTFILEPDF"

Expand Down

0 comments on commit a86a4f8

Please sign in to comment.