#!/usr/bin/env zsh ### : ' Scans several pages using `scanpage` and combines them into a single PDF file. ' ### # change this to your preferred PDF viewer _viewer="zathura" ### trap _ctrlc INT function _cleanup() { # cleanup _tmpdir rm -rf $_tmpdir } function _ctrlc() { echo "cancelled by SIGINT/^C" _cleanup exit 1 } _cmd="" _file="" _landscape=false _silent=false _tmpdir="" usage () { echo 'Scans several pages using `scanpage` and combines them into a single PDF file. options: -h, --help prints this message -l, --landscape rotates the pages 90° left for landscape scans -o, --outfile FILE writes the scan to FILE instead of using a temporary file -r, --rotate same as -l -s, --silent silently write output file, don’t open it --viewer CMD uses CMD as PDF viewer' } ###~begin option parsing zparseopts -A _OPTS -D -E -- h l o: r --help -outfile: -landscape -rotate -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]" ;; -s|--silent) _silent=true ;; --viewer) _viewer="$_OPTS[$opt]" ;; esac done ###~end option parsing # setup temporary directory for scans; we deffo need it for the intermediate, # single page files this time _tmpdir=`mktemp -d` # check file ending if outfile is specified (and add it), else use tmpfile if [ ! -z $_file ] ; then if [[ ! "$_file" =~ ".*\.pdf" ]] ; then _file="${_file}.pdf"; fi else _file="${_tmpdir}/$(date +%Y-%m-%d).pdf" fi i=1 done=false while ! $done do echo "Starting scan …" scanpage -s$( ( $_landscape ) && print "l")o ${_tmpdir}/$(printf "%0*d" 3 ${i}).png echo "Page $i scanned. Insert next page and hit . ^D to finish the document." let i++ read [ "$?" -eq "1" ] && done=true done # concatenate scanned pages echo "Concatenating pages …" magick "$_tmpdir/*.png" "${_file}" pushd $_tmpdir ps2pdf -dPDFSETTINGS=/ebook "${_file}" popd ( $_silent ) || $_viewer "${_file}.pdf" >/dev/null 2>/dev/null _cleanup