|
|
@@ -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: |
|
|
|