#!/bin/bash # http://www.alfredklomp.com/programming/shrinkpdf # Licensed under the 3-clause BSD license: # # Copyright (c) 2014, Alfred Klomp # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. shrink () { gs \ -dNOPAUSE -dBATCH -dSAFER \ -sDEVICE=pdfwrite \ -dPDFSETTINGS=$3 \ -dEmbedAllFonts=true \ -dSubsetFonts=true \ -dAutoRotatePages=/None \ -dColorImageDownsampleType=/Bicubic \ -dColorImageResolution=$4 \ -dGrayImageDownsampleType=/Bicubic \ -dGrayImageResolution=$4 \ -dMonoImageDownsampleType=/Bicubic \ -dMonoImageResolution=$4 \ -sOutputFile="$2" "${@:5}" \ "$1" } usage () { echo "Reduces PDF filesize by lossy recompressing with Ghostscript." echo " Usage: $1 infile [outfile] [preset(/printer)] [image-dpi(300)]" echo " Presets available (ascending quality): /screen /ebook /printer /prepress" } infile="$1" # Need an input file: if [ -z "$infile" ]; then usage "$0" exit 1 fi outfile="${2:-$1}" if [ "$infile" = "$outfile" ]; then infile="${1%.*}-original.pdf" mv "$1" "$infile" fi quality="${3:-"/printer"}" res="${4:-300}" shrink "$infile" "$outfile" "$quality" "$res" "${@:5}" || exit $? [ ! -f "$infile" -o ! -f "$outfile" ] && exit 0 ISIZE="$(echo $(wc -c "$infile") | cut -f1 -d\ )" OSIZE="$(echo $(wc -c "$outfile") | cut -f1 -d\ )" if [ "$ISIZE" -lt "$OSIZE" -a $# -lt 5 ]; then echo "Shrinking was not successfull, doing straight copy!" cp "$infile" "$outfile" [ "$1" = "$outfile" ] && rm $infile fi