#!/bin/sh set -eu usage() { cat <<-'EOF' Usage: print [-d] [-q QUALITY] [FILE...] print -h EOF } help() { cat <<-'EOF' Options: -d print duplex/double-sided -q QUALITY choose the print quality, either: low, medium (default) or high. -h, --help show this message FILE path to file to be printed Print FILE using CUPS using lp(1). Examples: Print the given PostScript file with default quality: $ print f1.ps Print multiple PDF files with high quality: $ print -dq high *.pdf Print the file from STDIN, double-sided: $ print -d < f2.ps Print multiple source code files: $ print src/*.{c,h} EOF } n_pages() { qpdf "$1" --show-npages } main() { if file -b "$FILE" | grep -q PostScript; then ps2pdf "$FILE" "$NEWDIR"/in.pdf elif file -b "$FILE" | grep -q PDF; then cp "$FILE" "$NEWDIR"/in.pdf else enscript -o- "$FILE" | ps2pdf - "$NEWDIR"/in.pdf fi cd "$NEWDIR" if [ -z "$DUPLEX" ]; then lp in.pdf cd - > /dev/null return fi if [ "$(n_pages in.pdf)" = '1' ]; then lp in.pdf return fi qpdf in.pdf --pages . 1-z:odd -- odd.pdf qpdf in.pdf --pages . 1-z:even -- even.pdf NODD="$(n_pages odd.pdf)" NEVEN="$(n_pages even.pdf)" printf 'Printing odd pages...\n' >&2 lp odd.pdf printf 'Has printing finished yet? Once it does, reload the pages and hit it enter to continue. ' read -r < /dev/tty lp even.pdf if [ "$NODD" != "$NEVEN" ]; then printf '\n' | lp fi cd - > /dev/null } for flag in "$@"; do case "$flag" in (--) break ;; (--help) usage help exit ;; (*) ;; esac done QUALITY_SET=false DUPLEX= while getopts 'dq:h' flag; do case "$flag" in (d) DUPLEX=1 ;; (q) QUALITY_SET=true case "$OPTARG" in low) lpoptions -o PrintQuality=draft ;; medium) lpoptions -o PrintQuality=standard ;; high) lpoptions -o PrintQuality=high ;; *) echo "Bad QUALITY option: \"$OPTARG\"" >&2 exit 2 ;; esac ;; (h) usage help exit ;; (*) usage >&2 exit 2 ;; esac done shift $((OPTIND - 1)) if [ "$QUALITY_SET" = false ]; then lpoptions -o PrintQuality=standard fi NEWDIR="$(mkdtemp)" trap 'rm -rf "$NEWDIR"' EXIT if [ -z "${1:-}" ]; then FILE="$NEWDIR"/STDIN cat - > "$FILE" main else for f in "$@"; do FILE="$f" main done fi