scan-cli/scanmultipage
2024-02-11 23:13:52 +01:00

110 lines
2.1 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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, dont 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 <Enter>. ^D to finish the document."
let i++
read
[ "$?" -eq "1" ] && done=true
done
# concatenate scanned pages
echo "Concatenating pages …"
convert "$_tmpdir/*.png" $_file
( $_silent ) || $_viewer $_file >/dev/null 2>/dev/null
_cleanup