2024-02-11 23:13:52 +01:00
|
|
|
|
#!/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 <Enter>. ^D to finish the document."
|
|
|
|
|
let i++
|
|
|
|
|
read
|
|
|
|
|
[ "$?" -eq "1" ] && done=true
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
# concatenate scanned pages
|
|
|
|
|
echo "Concatenating pages …"
|
2024-07-04 11:37:13 +02:00
|
|
|
|
magick "$_tmpdir/*.png" "${_file}"
|
2024-07-04 11:35:46 +02:00
|
|
|
|
pushd $_tmpdir
|
|
|
|
|
ps2pdf -dPDFSETTINGS=/ebook "${_file}"
|
|
|
|
|
popd
|
2024-02-11 23:13:52 +01:00
|
|
|
|
|
2024-07-04 11:35:46 +02:00
|
|
|
|
( $_silent ) || $_viewer "${_file}.pdf" >/dev/null 2>/dev/null
|
2024-02-11 23:13:52 +01:00
|
|
|
|
|
|
|
|
|
_cleanup
|