aboutsummaryrefslogtreecommitdiff
path: root/src/bin/duplex
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/duplex')
-rwxr-xr-xsrc/bin/duplex140
1 files changed, 140 insertions, 0 deletions
diff --git a/src/bin/duplex b/src/bin/duplex
new file mode 100755
index 00000000..12b254e8
--- /dev/null
+++ b/src/bin/duplex
@@ -0,0 +1,140 @@
+#!/bin/sh
+set -eu
+
+usage() {
+ cat <<-'EOF'
+ Usage:
+ duplex [-q QUALITY] [FILE...]
+ duplex -h
+EOF
+}
+
+help() {
+ cat <<-'EOF'
+
+ Options:
+ -q QUALITY choose the print quality, either:
+ low, medium (default) or high.
+ -h, --help show this message
+
+ Examples:
+
+ Print the given PostScript file with default quality:
+ duplex f1.ps
+
+ Print multiple PDF files with high quality:
+ duplex -q high *.pdf
+
+ Print the file from STDIN:
+ cat f2.ps | duplex
+EOF
+}
+
+mkdtemp() {
+ name="$(echo 'mkstemp(template)' |
+ m4 -D template="${TMPDIR:-/tmp}/m4-tmpname.")"
+ rm -f "$name"
+ mkdir "$name"
+ echo "$name"
+}
+
+n_pages() {
+ pdftk "$1" dump_data | awk '/NumberOfPages/ { print $2 }'
+}
+
+main() {
+ if file -b in-tmp | grep -q PostScript; then
+ ps2pdf in-tmp in.pdf
+ elif file -b in-tmp | grep -q PDF; then
+ cp in-tmp in.pdf
+ else
+ printf "Don't know how to duplex print input file:\n" >&2
+ file in-tmp >&2
+ printf '\nGive me either a PostScript or PDF file instead.\n' >&2
+ exit 2
+ fi
+
+ FULL="$(n_pages in.pdf)"
+ if [ "$FULL" = '1' ]; then
+ lp in.pdf
+ return
+ fi
+
+ pdftk A=in.pdf cat Aodd output odd.pdf
+ pdftk A=in.pdf cat Aeven output 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
+}
+
+for flag in "$@"; do
+ case "$flag" in
+ --)
+ break
+ ;;
+ --help)
+ usage
+ help
+ exit
+ ;;
+ *)
+ ;;
+ esac
+done
+
+lpoptions -o PrintQuality=standard
+while getopts 'hq:' flag; do
+ case "$flag" in
+ q)
+ 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))
+
+OLDDIR="$PWD"
+cd "$(mkdtemp)" #FIXME
+if [ -z "${1:-}" ]; then
+ cat - > in-tmp
+ main
+else
+ for f in "$@"; do
+ # ABS="$(echo "$(cd "$(dirname "$f")"; pwd -P)/$(basename "$f")")"
+ # echo "$ABS"
+ cp "$OLDDIR/$(basename "$f")" in-tmp
+ main
+ done
+fi