You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
3.8 KiB
Bash

#!/bin/bash
###############################################################################
#
# pdf-optimize: compress pdf using Ghostscript
#
# Copyright (C) 2020
# Author: Solal "Otthorn" Nathan <otthorn@crans.org>
# SPDX-License-Identifier: GPL-3.0-or-later
#
###############################################################################
#
# This program comes with ABSOLUTELY NO WARRANTY; This is free software, and
# you are welcome to redistribute it under certain conditions; See licence for
# more details.
#
###############################################################################
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
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
-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 -pr "$* [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 \
${bold}$output_path${normal}."
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)
echo "Size reduced from ${bold}$input_size_h${normal} to \
${bold}$output_size_h${normal} [$percentage %]"
}
# font settings
bold=$(tput bold)
normal=$(tput sgr0)
# default values
quiet=0; # do not be quiet
verbose=0; # do not be verbose
replace=0; # do not replace existing files
# execute main function
run "$@";