aboutsummaryrefslogtreecommitdiff
#!/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
	elif file -b "$FILE" | grep -q text; then
		enscript -C -o- "$FILE" | ps2pdf - "$NEWDIR"/in.pdf
	else
		lp $OPTS "$FILE"
		return
	fi
	cd "$NEWDIR"

	if [ -z "$DUPLEX" ]; then
		lp $OPTS in.pdf
		cd - > /dev/null
		return
	fi

	if [ "$(n_pages in.pdf)" = '1' ]; then
		lp $OPTS 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 $OPTS odd.pdf
	printf 'Has printing finished yet?  Once it does, reload the pages and hit it enter to continue. '
	read -r < /dev/tty
	lp $OPTS 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

DUPLEX=
OPTS='-o PrintQuality=standard'
while getopts 'dq:h' flag; do
	case "$flag" in
		(d)
			DUPLEX=1
			;;
		(q)
			case "$OPTARG" in
				low)
					OPTS='-o PrintQuality=draft'
					;;
				medium)
					OPTS='-o PrintQuality=standard'
					;;
				high)
					OPTS='-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))

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