#!/usr/bin/env bash # This is here because scanimage's batch mode is broken for my scanner function help() { cat < [ -- args ]: Scan a (multi-page) document to , 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