diff --git a/README.md b/README.md index d20a7b1..97e72f5 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ You need to have ghoscript installed on your machine. ``` git clone https://gitea.auro.re/otthorn/pdf-optimize cd pdf-optimize -chmod +x pdf-optimize +chmod +x pdf-optimize.sh sudo mkdir -p /opt/bin/ -sudo cp pdf-optimize /opt/bin/ +sudo cp pdf-optimize.sh /opt/bin/pdf-optimize ``` Don't forget to add `/opt/bin` to your `PATH`. diff --git a/pdf-optimize b/pdf-optimize index 93833c8..d2bd9b5 100755 --- a/pdf-optimize +++ b/pdf-optimize @@ -17,146 +17,132 @@ function usage { - echo "usage: pdf-optimize [options] input.pdf" - echo " "; - echo " -a | --archive : archive mode (PDF/A)"; - echo " -c | --compatibility : compability more with PDF 1.4"; - echo " -h | --help : print this message"; - echo " -k | --quality : choose quality profile from: - * 1 HIGH QUALITY [default] - * 2 LOW QUALITY - * 3 AGGRESSIVE - * 4 VERY AGGRESIVE"; - echo " -o | --output : output filename"; - echo " -q | --quiet : run quietly"; - echo " -v | --verbose : run verbosly"; - echo " -y | --yes-to-replace : yes to replace existing files"; - echo " "; - echo "If no output path is specified, given input.pdf as input will output + echo "usage: pdf-optimize [options] input.pdf" + echo " "; + echo " -o | --output : output filename"; + echo " -q | --quiet : run quietly"; + echo " -v | --verbose : run verbosly"; + echo " -y | --yes-to-replace : yes to replace existing files"; + echo " -h | --help : print this message"; + echo " "; + echo "If no output path is specified, given input.pdf as input will output input_compressed.pdf" } function arg_parse { - # if no argument is given print help - if [[ -z "$1" ]]; then - usage; exit; - fi - - # positional arguments - args=() - - while [ "$1" != "" ]; do - case "$1" in - -k | --quality ) quality="$2"; shift;; - -o | --output ) output_path="$2"; shift;; - -a | --archive ) archive=1;; - -c | --compatibility ) compatibility=1;; - -q | --quiet ) quiet=1;; - -v | --verbose ) verbose=1;; - -y | --yes-to-replace ) replace=1;; - -h | --help ) usage; exit;; - * ) args+=("$1") - esac - shift - done - - # restore positional argument - set -- "${args[@]}" - - # only the first one should be used - input_path="${args[0]}" - - # add default output path if none is given - if [[ -z "$output_path" ]]; then - output_path="${input_path%.*}_compressed.pdf"; - fi - - # check if the output file already exists before writting to it - if [[ -f "$output_path" && "$replace" == 0 ]]; then - yes_or_no "$output_path already exists, do you want to replace it?" || - exit 1; - fi - - # check if the input file exists - if [[ ! -f "$input_path" ]]; then - echo "$input_path does not exist." - echo "Aborting"; - exit 1; - fi + # if no argument is given print help + if [[ -z "$1" ]]; then + usage; exit; + fi + + # positional arguments + args=() + + while [ "$1" != "" ]; do + case "$1" in + -o | --output ) output_path="$2"; shift;; + -q | --quiet ) quiet=1;; + -v | --verbose ) verbose=1;; + -y | --yes-to-replace ) replace=1;; + -h | --help ) usage; exit;; + * ) args+=("$1") + esac + shift + done + + # restore positional argument + set -- "${args[@]}" + + # only the first one should be used + input_path="${args[0]}" + + # add default output path if none is given + if [[ -z "$output_path" ]]; then + output_path="${input_path%.*}_compressed.pdf"; + fi + + # check if the output file already exists before writting to it + if [[ -f "$output_path" && "$replace" == 0 ]]; then + yes_or_no "$output_path already exists, do you want to replace it?" || + exit 1; + fi + + # check if the input file exists + if [[ ! -f "$input_path" ]]; then + echo "$input_path does not exist." + echo "Aborting"; + exit 1; + fi } function yes_or_no { - read -p "$* [y/N]: " ans - case "$ans" in - [yY] | [yY]es ) return 0;; - * ) echo "Aborting"; return 1;; - esac + read -p "$* [y/N]: " ans + case "$ans" in + [yY] | [yY]es ) return 0;; + * ) echo "Aborting"; return 1;; + esac } function run { - arg_parse "$@"; - - # print general information - if [[ "$quiet" != 1 ]]; then - echo "Compressing from ${bold}$input_path${normal} into \ + arg_parse "$@"; + + # print general information + if [[ "$quiet" != 1 ]]; then + echo "Compressing from ${bold}$input_path${normal} into \ ${bold}$output_path${normal}." - fi - - # define the base command - base_command=" - gs -sDEVICE=pdfwrite \ - -dPDFSETTINGS=/prepress \ - -dNOPAUSE \ - -dBATCH "; - - # add compatibilty - if [[ "$compatibility" == 1 ]]; then - base_command+="-dCompatibilityLevel=1.4 "; - fi - - # ask ghostsript to be quiet - if [[ "$verbose" == 1 ]]; then - base_command+="-dQUIET "; - fi - - # add archive mode option - if [[ "$archive" == 1 ]]; then - base_command+="-dPDFA=2 -dPDFACompatibilityPolicy=1 " - fi - - # add input and ouput paths - base_command+="-sOutputFile=$output_path \ - $input_path" - - # run command - echo $base_command; - #eval $base_command; - - # catching errors - if [[ "$?" != 0 ]]; then - echo "Something went wrong with ghostscript."; - echo "Aborting."; - exit 1; - fi - - # compute the compresion rate - if [[ "$quiet" != 1 ]]; then - #compute_compression; - fi + fi + + # run the compression using ghostscript + if [[ "$verbose" != 1 ]]; then + ghostscript -sDEVICE=pdfwrite \ + -dCompatibilityLevel=1.4 \ + -dPDFSETTINGS=/prepress \ + -dNOPAUSE \ + -dQUIET \ + -dBATCH \ + -sOutputFile=$output_path \ + $input_path + else + echo "input_path=$input_path"; + echo "output_path=$output_path"; + echo "quiet=$quiet"; + echo "verbose=$verbose"; + echo "replace=$replace"; + echo " "; + ghostscript -sDEVICE=pdfwrite \ + -dCompatibilityLevel=1.4 \ + -dPDFSETTINGS=/prepress \ + -dNOPAUSE \ + -dBATCH \ + -sOutputFile=$output_path \ + $input_path + fi + + # catching errors + if [[ "$?" != 0 ]]; then + echo "Something went wrong with ghostscript."; + echo "Aborting."; + exit 1; + fi + + # compute the compresion rate + if [[ "$quiet" != 1 ]]; then + compute_compression; + fi } function compute_compression { - input_size=`du "$input_path" | cut -f1` - output_size=`du "$output_path" | cut -f1` - percentage=`echo "scale=1;$output_size / $input_size * 100" | bc -l` - input_size_h=`du -h "$input_path" | cut -f1` - output_size_h=`du -h "$output_path" | cut -f1` + input_size=`du "$input_path" | cut -f1` + output_size=`du "$output_path" | cut -f1` + percentage=`echo "scale=1;$output_size / $input_size * 100" | bc -l` + input_size_h=`du -h "$input_path" | cut -f1` + output_size_h=`du -h "$output_path" | cut -f1` - echo "Size reduced from ${bold}$input_size_h${normal} to \ + echo "Size reduced from ${bold}$input_size_h${normal} to \ ${bold}$output_size_h${normal} [$percentage %]" }