scan-to-pdf.nix (1613B)
1 { pkgs, ... }: 2 3 { 4 environment.systemPackages = [ 5 (pkgs.writeShellScriptBin "scan-to-pdf" '' 6 set -e 7 8 # Default values 9 MODE="Gray" 10 SOURCE="ADF Front" 11 12 # Parse arguments in any order 13 for arg in "$@"; do 14 case "$arg" in 15 color) 16 MODE="Color" 17 ;; 18 duplex) 19 SOURCE="ADF Duplex" 20 ;; 21 *) 22 echo "Unknown argument: $arg" 23 echo "Usage: scan-to-pdf [color] [duplex]" 24 exit 1 25 ;; 26 esac 27 done 28 29 # Display scanning mode 30 if [ "$MODE" = "Color" ]; then 31 echo "Scanning in color mode" 32 else 33 echo "Scanning in greyscale, add 'color' argument to scan in full color" 34 fi 35 36 if [ "$SOURCE" = "ADF Duplex" ]; then 37 echo "Scanning both sides (duplex mode)" 38 else 39 echo "Scanning single-sided, add 'duplex' argument to scan both sides" 40 fi 41 42 OUTPUT="output-$(date +%Y%m%d-%H%M%S).pdf" 43 TMPDIR=$(mktemp -d) 44 45 cleanup() { 46 rm -rf "$TMPDIR" 47 } 48 trap cleanup EXIT 49 50 echo "Scanning pages..." 51 if ! ${pkgs.sane-backends}/bin/scanimage --format=tiff --resolution 300 --mode "$MODE" \ 52 --batch="$TMPDIR/page%d.tiff" --source "$SOURCE"; then 53 echo "Error: Scanning failed. Is there paper in the ADF?" 54 exit 1 55 fi 56 57 if ! ls "$TMPDIR"/*.tiff 1> /dev/null 2>&1; then 58 echo "Error: No pages were scanned." 59 exit 1 60 fi 61 62 echo "Converting to PDF..." 63 ${pkgs.imagemagick}/bin/magick "$TMPDIR"/*.tiff "$TMPDIR/combined.pdf" 64 65 echo "Running OCR..." 66 ${pkgs.ocrmypdf}/bin/ocrmypdf --deskew --rotate-pages --rotate-pages-threshold 0.5 \ 67 --optimize 1 "$TMPDIR/combined.pdf" "$OUTPUT" 68 69 echo "Done! Output saved to: $OUTPUT" 70 '') 71 ]; 72 }