.files/nix/packages/by-name/easyscan/easyscan.sh

97 lines
1.7 KiB
Bash
Executable file

#!/usr/bin/env bash
# This is here because scanimage's batch mode is broken for my scanner
function help() {
cat <<EOF
easyscan
easyscan wraps scanimage and joins the resulting pdf.
Usage:
easyscan <target_file> [ -- args ]:
Scan a (multi-page) document to <target_file>, passing args to scanimage
EOF
}
if [ $# -lt 1 ]; then
help
exit 1
fi
OUTPUT_FILE="$1.pdf"
if [ -e "$OUTPUT_FILE" ]; then
echo "$OUTPUT_FILE" already exists, you are probably making a mistake!
exit 1
fi
shift
scanimage_args=(
"-x" "210"
"-y" "297"
"--resolution" "300"
)
while [ $# -gt 0 ]; do
case $1 in
--help)
help
exit
;;
--)
shift
scanimage_args+=("$@")
break
;;
*)
shift
;;
esac
done
tempdir="$(mktemp -d)"
filenames=()
counter=1
function clean() {
# Make sure I don't remove things other than pdf
rm "$tempdir/"*.pdf
rm -d "$tempdir"
}
trap clean EXIT
while :; do
ok="true"
echo "Scanning page $counter"
CUR_FNAME="$tempdir/easyscan_$counter.pdf"
# If no size is set, the output will be wonky-sized
# 210,297 is the size of A4
scanimage "${scanimage_args[@]}" -o "$CUR_FNAME" || ok="false"
if $ok; then
counter=$((counter += 1))
filenames+=("$CUR_FNAME")
fi
IFS= read -r -p "Continue scanning? [Y/n] " cont
case "$cont" in
[nN])
echo "Exiting..."
break
;;
[yY] | *) ;;
esac
done
# Multiple files are scanned, join them
#
# Note: do NOT use the * glob, because bash orders lexicographically and not
# numerically, the merged ordering will be wrong.
merged_filename="$tempdir/easyscan_final.pdf"
pdfunite "${filenames[@]}" "$merged_filename"
# Copy scan to current directory
mkdir -p "$(dirname "$OUTPUT_FILE")"
cp "$merged_filename" "$OUTPUT_FILE"
clean