diff --git a/README.md b/README.md index 97e72f5..d20a7b1 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.sh +chmod +x pdf-optimize sudo mkdir -p /opt/bin/ -sudo cp pdf-optimize.sh /opt/bin/pdf-optimize +sudo cp pdf-optimize /opt/bin/ ``` Don't forget to add `/opt/bin` to your `PATH`. diff --git a/pdf-optimize b/pdf-optimize index d2bd9b5..93833c8 100755 --- a/pdf-optimize +++ b/pdf-optimize @@ -17,132 +17,146 @@ function usage { - 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 + 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 input_compressed.pdf" } function arg_parse { - # if no argument is given print help - if [[ -z "$1" ]]; then - usage; exit; - fi + # if no argument is given print help + if [[ -z "$1" ]]; then + usage; exit; + fi - # positional arguments - args=() + # 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 + 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[@]}" + # restore positional argument + set -- "${args[@]}" - # only the first one should be used - input_path="${args[0]}" + # 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 + # 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 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 + # 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 + 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 + # define the base command + base_command=" + gs -sDEVICE=pdfwrite \ + -dPDFSETTINGS=/prepress \ + -dNOPAUSE \ + -dBATCH "; - # compute the compresion rate - if [[ "$quiet" != 1 ]]; then - compute_compression; - fi + # 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 } 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 %]" }