#!/usr/bin/env zsh ### : ' Scans a single page using sane’s `scanimage` and converts it to PDF using ImageMagick. ' ### # find your device URI by doing `lpstat -s`! # (mine is an HP network printer connected through HPLIP) _device="hpaio:/net/DeskJet_3630_series?hostname=drucker.vandenhorz.de" # change this to your preferred PDF viewer _viewer="zathura" ### trap _ctrlc INT function _cleanup() { # clean up _tmpdir, if created earlier if [ ! -z $_tmpdir ] ; then rm -rf $_tmpdir; fi } function _ctrlc() { echo "cancelled by SIGINT/^C" _cleanup exit 1 } _cmd="" _file="" _landscape=false _silent=false _tmpdir="" usage () { echo 'Scans a single page using sane’s `scanimage` and converts it to PDF using ImageMagick and opens it in Evince. options: -h, --help prints this message -l, --landscape rotates the page 90° left for landscape scans -o, --outfile FILE silently writes the scan to FILE instead of using a temporary file implies -s -r, --rotate same as -l -s, --silent silently write output file, don’t open it --viewer CMD uses CMD as PDF viewer instead of Evince' } ###~begin option parsing zparseopts -A _OPTS -D -E -- h l o: r s -help -outfile: -landscape -rotate -silent -viewer if [ ! -z "$@" ] ; then usage exit 1 fi for opt in "${(@k)_OPTS}"; do case $opt in -h|--help) usage exit 0 ;; -l|-r|--landscape|--rotate) _landscape=true ;; -o|--outfile) _file="$_OPTS[$opt]" _silent=true ;; -s|--silent) _silent=true ;; --viewer) _viewer="$_OPTS[$opt]" ;; esac done ###~end option parsing # check file ending if outfile is specified (and add it), else use tmpfile # skip when silent (e.g. invoked by `scanmultipage`) if [ ! -z $_file ] ; then if [[ ! "$_file" =~ ".*\.pdf" ]] ; then ( $_silent ) || _file="${_file}.pdf"; fi else _tmpdir=`mktemp -d` _file="${_tmpdir}/$(date +%Y-%m-%d).pdf" fi scanimage -d "$_device" -p --resolution 300 --mode Color -x 210 -y 297 --format=png | magick $( ( $_landscape ) && print "\-rotate \-90 ")- $_file && \ ( $_silent ) || $_viewer $_file >/dev/null 2>/dev/null _cleanup