Browse Source

changes to flip detection, adding GS autoRotation options for resizing

master
Gustavo Neves 8 years ago
parent
commit
4e02c87e7a
1 changed files with 123 additions and 74 deletions
  1. +123
    -74
      pdfScale.sh

+ 123
- 74
pdfScale.sh View File

@@ -50,6 +50,8 @@ MODE=""
RESIZE_PAPER_TYPE=""
CUSTOM_RESIZE_PAPER=$FALSE
FLIP_DETECTION=$TRUE
FLIP_FORCE=$FALSE
AUTO_ROTATION='/PageByPage'
PGWIDTH=""
PGHEIGHT=""
RESIZE_WIDTH=""
@@ -122,7 +124,76 @@ main() {
}


########################## INITIALIZER ##########################
###################### GHOSTSCRIPT CALLS #######################

# Runs the ghostscript scaling script
pageScale() {
# Compute translation factors (to center page).
XTRANS=$(echo "scale=6; 0.5*(1.0-$SCALE)/$SCALE*$PGWIDTH" | "$BCBIN")
YTRANS=$(echo "scale=6; 0.5*(1.0-$SCALE)/$SCALE*$PGHEIGHT" | "$BCBIN")
vprint " Translation X: $XTRANS"
vprint " Translation Y: $YTRANS"

local increase=$(echo "scale=0; (($SCALE - 1) * 100)/1" | "$BCBIN")
vprint " Run Scaling: $increase %"

# Scale page
"$GSBIN" \
-q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER \
-dCompatibilityLevel="1.5" -dPDFSETTINGS="/printer" \
-dColorConversionStrategy=/LeaveColorUnchanged \
-dSubsetFonts=true -dEmbedAllFonts=true \
-dDEVICEWIDTHPOINTS=$PGWIDTH -dDEVICEHEIGHTPOINTS=$PGHEIGHT \
-sOutputFile="$OUTFILEPDF" \
-c "<</BeginPage{$SCALE $SCALE scale $XTRANS $YTRANS translate}>> setpagedevice" \
-f "$INFILEPDF"

return $?
}


# Runs the ghostscript paper resize script
pageResize() {
# Get new paper sizes if not custom paper
isNotCustomPaper && getGSPaperSize "$RESIZE_PAPER_TYPE"

vprint " Auto Rotate: $(basename $AUTO_ROTATION)"

# Flip detect
local tmpInverter=""
if [[ $FLIP_DETECTION -eq $TRUE || $FLIP_FORCE -eq $TRUE ]]; then
if [[ $PGWIDTH -gt $PGHEIGHT && $RESIZE_WIDTH -lt $RESIZE_HEIGHT ]] || [[ $FLIP_FORCE -eq $TRUE ]]; then
[[ $FLIP_FORCE -eq $TRUE ]] && vprint " Flip Detect: Forced Mode!" || vprint " Flip Detect: Wrong orientation detected!"
vprint " Inverting Width <-> Height"
tmpInverter=$RESIZE_HEIGHT
RESIZE_HEIGHT=$RESIZE_WIDTH
RESIZE_WIDTH=$tmpInverter
else
vprint " Flip Detect: No change needed"
fi
else
vprint " Flip Detect: Disabled"
fi

vprint " Run Resizing: $(uppercase "$RESIZE_PAPER_TYPE") ( "$RESIZE_WIDTH" x "$RESIZE_HEIGHT" ) pts"

# Change page size
"$GSBIN" \
-q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER \
-dCompatibilityLevel="1.5" -dPDFSETTINGS="/printer" \
-dColorConversionStrategy=/LeaveColorUnchanged \
-dSubsetFonts=true -dEmbedAllFonts=true \
-dDEVICEWIDTHPOINTS=$RESIZE_WIDTH -dDEVICEHEIGHTPOINTS=$RESIZE_HEIGHT \
-dAutoRotatePages=$AUTO_ROTATION \
-dFIXEDMEDIA -dPDFFitPage \
-sOutputFile="$OUTFILEPDF" \
-f "$INFILEPDF"

return $?
}


########################## INITIALIZERS #########################

# Loads external dependencies and checks for errors
initDeps() {
@@ -160,7 +231,7 @@ checkDeps() {

# Parse options
getOptions() {
while getopts ":vhVs:m:r:pf" o; do
while getopts ":vhVs:m:r:pf:a:" o; do
case "${o}" in
v)
((VERBOSE++))
@@ -187,7 +258,10 @@ getOptions() {
exit $EXIT_SUCCESS
;;
f)
FLIP_DETECTION=$FALSE
parseFlipDetectionMode ${OPTARG}
;;
a)
parseAutoRotationMode ${OPTARG}
;;
*)
initError "Invalid Option: -$OPTARG" $EXIT_INVALID_OPTION
@@ -229,75 +303,6 @@ parseScale() {
SCALE="$1"
}


###################### GHOSTSCRIPT CALLS #######################

# Runs the ghostscript scaling script
pageScale() {
# Compute translation factors (to center page).
XTRANS=$(echo "scale=6; 0.5*(1.0-$SCALE)/$SCALE*$PGWIDTH" | "$BCBIN")
YTRANS=$(echo "scale=6; 0.5*(1.0-$SCALE)/$SCALE*$PGHEIGHT" | "$BCBIN")
vprint " Translation X: $XTRANS"
vprint " Translation Y: $YTRANS"

local increase=$(echo "scale=0; (($SCALE - 1) * 100)/1" | "$BCBIN")
vprint " Run Scaling: $increase %"

# Scale page
"$GSBIN" \
-q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER \
-dCompatibilityLevel="1.5" -dPDFSETTINGS="/printer" \
-dColorConversionStrategy=/LeaveColorUnchanged \
-dSubsetFonts=true -dEmbedAllFonts=true \
-dDEVICEWIDTHPOINTS=$PGWIDTH -dDEVICEHEIGHTPOINTS=$PGHEIGHT \
-sOutputFile="$OUTFILEPDF" \
-c "<</BeginPage{$SCALE $SCALE scale $XTRANS $YTRANS translate}>> setpagedevice" \
-f "$INFILEPDF"

return $?
}


# Runs the ghostscript paper resize script
pageResize() {
# Get new paper sizes if not custom paper
isNotCustomPaper && getGSPaperSize "$RESIZE_PAPER_TYPE"

# Flip detect
local tmpInverter=""
if [[ $FLIP_DETECTION -eq $TRUE ]]; then
if [[ $PGWIDTH -gt $PGHEIGHT && $RESIZE_WIDTH -lt $RESIZE_HEIGHT ]]; then
vprint " Flip Detect: Wrong orientation!"
vprint " Inverting Width <-> Height"
tmpInverter=$RESIZE_HEIGHT
RESIZE_HEIGHT=$RESIZE_WIDTH
RESIZE_WIDTH=$tmpInverter
else
vprint " Flip Detect: No change needed"
fi
else
vprint " Flip Detect: Disabled"
fi

vprint " Run Resizing: $(uppercase "$RESIZE_PAPER_TYPE") ( "$RESIZE_WIDTH" x "$RESIZE_HEIGHT" ) pts"

# Change page size
"$GSBIN" \
-q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER \
-dCompatibilityLevel="1.5" -dPDFSETTINGS="/printer" \
-dColorConversionStrategy=/LeaveColorUnchanged \
-dSubsetFonts=true -dEmbedAllFonts=true \
-dDEVICEWIDTHPOINTS=$RESIZE_WIDTH -dDEVICEHEIGHTPOINTS=$RESIZE_HEIGHT \
-dFIXEDMEDIA -dPDFFitPage \
-sOutputFile="$OUTFILEPDF" \
-f "$INFILEPDF"

return $?
}


################### PDF PAGE SIZE DETECTION ####################

# Parse a forced mode of operation
parseMode() {
if isEmpty "$1"; then
@@ -339,6 +344,47 @@ parseMode() {
return $FALSE
}

# Parses and validates the scaling factor
parseFlipDetectionMode() {
local param="$(lowercase $1)"
case "${param}" in
d|disable)
FLIP_DETECTION=$FALSE
FLIP_FORCE=$FALSE
;;
f|force)
FLIP_DETECTION=$FALSE
FLIP_FORCE=$TRUE
;;
*)
[[ "$param" != 'a' || "$param" != 'auto' ]] && printError "Error! Invalid Flip Detection Mode: \"$1\", using automatic mode!"
FLIP_DETECTION=$TRUE
FLIP_FORCE=$FALSE
;;
esac
}

# Parses and validates the scaling factor
parseAutoRotationMode() {
local param="$(lowercase $1)"
case "${param}" in
n|none)
AUTO_ROTATION='/None'
;;
a|all)
AUTO_ROTATION='/All'
;;
p|pagebypage|auto)
AUTO_ROTATION='/PageByPage'
;;
*)
printError "Error! Invalid Auto Rotation Mode: $param, using default: $(basename $AUTO_ROTATION)"
;;
esac
}


################### PDF PAGE SIZE DETECTION ####################

# Gets page size using imagemagick's identify
getPageSizeImagemagick() {
@@ -1006,8 +1052,11 @@ Parameters:
-r <paper> Triggers the Resize Paper Mode
Resize PDF paper proportionally
Uses a valid paper name or a custom defined paper
-f Disables the flip detection, paper will not be
rotated when inconsistent sizes are detected.
-f <mode> Flip Detection Mode, defaults to 'auto'.
Inverts Width <-> Height of a Resized PDF.
Modes: a, auto - automatic detection, default
f, force - forces flip W <-> H
d, disable - disables flipping
-p Prints Ghostscript paper info tables to screen

Scaling Mode:


Loading…
Cancel
Save