#!/usr/bin/env bash # option values for the brother DS-740D scanner simplex_source='Automatic Document Feeder(left aligned)' duplex_source='Automatic Document Feeder(left aligned,Duplex)' color_mode='24bit Color[Fast]' bw_mode='Black & White' grayscale_mode='True Gray' valid_resolutions=("100" "150" "200" "300" "400" "600" "1200") # default options for scanning sides=$simplex_source mode='c' resolution='300' current_page=$(find "$PWD" -name "out*.pdf" | sort | tail -n 1); read -r current_pageno <<<"${current_page//[^0-9]/ }" current_pageno=${current_pageno:-0} last_out_file="out$current_pageno.pdf" next_out_file="out$((current_pageno+1)).pdf" scan() { # device="brother5:bus2;dev2" device=$(scanimage -f "%d%n" | grep brother5 | head -n 1) echo "Selecting scanner '$device'" usage() { echo "scanbuddy.bash scan -d -r -b " } while getopts "dr:c:" flag; do case ${flag} in d) echo "Scanning duplex" sides=$duplex_source ;; r) if [[ ! " ${valid_resolutions[*]} " =~ [[:space:]]${OPTARG}[[:space:]] ]]; then echo "Resolution '$OPTARG' not supported!" echo "Supported resolutions: $(printf %s "${valid_resolutions[*]}")" exit 1 fi resolution=$OPTARG ;; c) mode=$OPTARG ;; *) ;; esac done case $mode in c) scanner_mode=$color_mode ;; b) scanner_mode=$bw_mode ;; g) scanner_mode=$grayscale_mode ;; *) echo "Mode '$mode' not supported! Supported modes: (c)olour|(b)lack & white|(g)reyscale" ;; esac echo "Scanning to '$next_out_file'..." scanimage \ --device-name="$device" \ --format=pdf \ --output-file="$next_out_file" \ --mode="$scanner_mode" \ --resolution="$resolution" \ --source="$sides" \ -x 210 -y 297 # A4 } if [ "$#" -lt 1 ]; then echo "You need an argument!" exit 1 fi case "$1" in scan) scan "${@:2}" ;; unscan) rm "$last_out_file" ;; dispatch) readarray -d '' out_files < <(find . -regextype posix-awk -regex "\./out[0-9]+\.pdf" -print0 | sort -Vz) combined_file=$(mktemp --suff="_scanbuddy.pdf") gs -q -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE="$combined_file" -dBATCH "${out_files[@]}" echo "Merged pdf written to $combined_file" # send to paperless PAPERLESS_STATUS=$(curl \ -H "Authorization: Token $PAPERLESS_TOKEN" \ -F document=@"$combined_file" \ "$([ -v PAPERLESS_TAG ] && echo "-F tags=$PAPERLESS_TAG")" \ "${PAPERLESS_URL}/api/documents/post_document/") || FAILED=1 if [ -v FAILED ]; then echo "Paperless failed with message:\n$PAPERLESS_STATUS" else echo "Paperless consumption job: '$PAPERLESS_STATUS'" fi ;; *) echo "Usage: scanbuddy" ;; esac