diff --git a/optipdf b/optipdf index fc32636..3a63f3e 100755 --- a/optipdf +++ b/optipdf @@ -105,6 +105,22 @@ if [[ ${#FILES[@]} -eq 0 ]]; then exit 2 fi +check_required_binaries() { + local BIN MISSING=() + for BIN; do + if ! type -t "$BIN" &>/dev/null; then + MISSING+=("$BIN") + fi + done + if [[ ${#MISSING[@]} -gt 0 ]]; then + printf 'Error: You are missing required programs:\n' >&2 + for BIN in "${MISSING[@]}"; do + printf -- '- %s\n' "$BIN" >&2 + done + exit 2 + fi +} + file_size() { stat \ --format='%s' \ @@ -116,43 +132,10 @@ file_size() { # produces a human-readable size from the byte count passed to it hr_size() ( - declare -i BYTES=$1 - - #UNITS=(B KB MB GB TB PB EB ZB YB) # shell math can only go so far... - UNITS=(B KB MB GB TB) - FACT=1024 - THRESH=9/10 - DECIMALS=1 - DECIMALS_FACTOR=$(( 10 ** DECIMALS )) - - # cycle through units from largest to smallest, exiting when it finds the - # largest applicable unit - for (( EXP = ${#UNITS[@]} - 1; EXP > -1; --EXP )); do - # check if the unit is close enough to the unit's size, within the - # threshold - if [[ $BYTES -gt $((FACT ** EXP * $THRESH)) ]]; then - # we found the applicable unit - - # must multiply by a factor of 10 here to not truncate - # the given number of decimal places after the point - HR_VAL=$(( BYTES * DECIMALS_FACTOR / FACT ** EXP )) - - # put the decimal point in - if [[ $DECIMALS -gt 0 ]]; then - HR_VAL=$(( HR_VAL / DECIMALS_FACTOR )).$(( HR_VAL % DECIMALS_FACTOR )) - fi - - HR_UNIT=${UNITS[$EXP]} - break - fi - done - - if [[ -z $HR_UNIT ]]; then - HR_VAL=$BYTES - HR_UNIT=${UNITS[0]} - fi - - printf '%g %s\n' "$HR_VAL" "$HR_UNIT" + numfmt \ + --to=iec \ + --suffix=B \ + "$@" ) setup_tempdir() { @@ -233,6 +216,9 @@ use_smaller() { } +check_required_binaries \ + qpdf + QPDF_ARGS=( --compression-level=9 --deterministic-id