#! /usr/bin/env dash # shellcheck source=/dev/null SHELL_LIBRARY_VERSION="1.1.3" . %SHELL_LIBRARY_PATH # needed for help() and version # shellcheck disable=2034 AUTHORS="Soispha"; # shellcheck disable=2034 YEARS="2023"; # shellcheck disable=2034 VERSION="1.0.0"; help() { cat << EOF Scan images and turn them into a pdf. Usage: $NAME [--help|--version|--out-dir|--num-pages|--method] --name --device Options: --out-dir | -o Path to place the generated pdf files (default: ./pdf). --name | -n Name for the pdf files (e.g. "\$name"_1.pdf). --num-pages | -p Number of pages to merge into one pdf (default: 1). --device | -d Device used for scanning. --method | -m Method to use for scanning (default: ADF). --help | -h Display this help and exit. --version | -v Display version and copyright information and exit. EOF } scan() { number_of_pages="$1"; device="$2"; output_directory="$3"; name="$4"; method="$5"; [ -z "$number_of_pages" ] && die "Parameter 'number_of_pages' is not set!" [ -z "$device" ] && die "Parameter 'device' is not set!" [ -z "$output_directory" ] && die "Parameter 'output_directory' is not set!" [ -z "$name" ] && die "Parameter 'name' is not set!" [ -z "$method" ] && die "Parameter 'method' is not set!" tiff_temp_path="$(mktmp -d)"; cd "$tiff_temp_path" || die "Bug" msg "Started scanning..."; if [ "$method" = "Flatbed" ]; then do_until_success \ "scanimage --format=tiff --progress --source='$method' --device='$device' --output-file=1.tiff" \ "warn 'Retrying scan, as we assume a network error!'" else for i in $(seq "$number_of_pages");do do_until_success \ "scanimage --format=tiff --progress --source='$method' --device='$device' --batch=%d.tif --batch-increment='$number_of_pages' --batch-start='$i'" \ "warn 'Retrying scan, as we assume a network error!'" if [ "$number_of_pages" -ne 1 ];then msg "Finished turn, please change side!"; readp "Press enter to continue" noop fi done fi msg "Creating output directory..."; mkdir "$output_directory"; cd "$output_directory" || die "Bug" counter=0; msg "Converting images to pdfs..."; while read -r scanned_image_a;do if [ "$number_of_pages" -ne 1 ];then scanned_image_b_set=false; if [ -z "$scanned_image_b" ];then scanned_image_b="$i" scanned_image_b_set=true; : $((counter += 1)) fi if [ -n "$scanned_image_a" ] && [ "$scanned_image_b_set" = false ];then convert "$scanned_image_b" "$scanned_image_a" -compress jpeg -quality 100 "$name"_"$counter".pdf fi else : $((counter += 1)) convert "$scanned_image_a" -compress jpeg -quality 100 "$name"_"$counter".pdf fi done < "$(tmp "fd . '$tiff_temp_path' | sort -n")" } for input in "$@"; do case "$input" in "--help" | "-h") help; exit 0; ;; "--version" | "-v") version; exit 0; ;; esac done number_of_pages="1"; unset device; output_directory="$(pwd)/pdf"; unset name; method="ADF"; while [ "$#" -ne 0 ]; do case "$1" in "--help" | "-h") ;; "--version" | "-v") ;; "--out-dir" | "-o") shift 1; output_directory="$1"; ;; "--name" | "-n") shift 1; name="$1"; ;; "--num-pages" | "-p") shift 1; number_of_pages="$1"; ;; "--device" | "-d") shift 1; device="$1"; ;; "--method" | "-m") shift 1; method="$1"; ;; *) die "Command line arg $1 does not exist. See --help for a list."; ;; esac shift 1; done scan "$number_of_pages" "$device" "$output_directory" "$name" "$method";