Browse Source

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

master
Gustavo Neves 8 years ago
parent
commit
344afb0dc2
1 changed files with 66 additions and 13 deletions
  1. +66
    -13
      pdfScale.sh

+ 66
- 13
pdfScale.sh View File

@@ -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 <factor>] <inFile.pdf> [outfile.pdf]
Usage: $BASENAME [-v] [-s <factor>] [-i] <inFile.pdf> [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 <factor> 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 <factor>] <inFile.pdf> [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 \


Loading…
Cancel
Save