linux compat
[dja/scandal.git] / scan2pages.sh
1 #!/bin/bash
2
3 function usage {
4 cat >&2 << __EOF__ 
5 Usage: $0 [-vfpsmut] [-d depth] pdffile outdir
6 Convert pdffile - a pdf of scanned facing pages - to a set of images in outdir,
7 each with only one page.
8 OPTIONS:
9         -v: Be verbose.
10         -d depth: Use given depth. Default is 1. Unpaper can only handle up to 8.
11         -s: skip masking/trimming. Overrides -m.
12         -f: Forceably redo everything.
13         -p: Forceably redo pdf conversion. Implies options below, equivalent to -f.
14         -m: Forceably redo masking/trimming and other preprocessing. Impiles options below.
15         -u: Forceably redo unpaper processing. Implies option below. IGNORED
16         -t: Forceably redo final trimming and cleaning. IGNORED
17 __EOF__
18 }
19
20 ## Setup and utilities ##
21 # Unpaper
22 UNPAPER_PATH="/home/wheel/dja/public-html/scandal/unpaper-0.3/bin"
23 PATH=$UNPAPER_PATH:$PATH
24
25 # Mac OS X doesn't have seq. It has jot instead.
26 Linux_seq="seq"
27 Darwin_seq="jot -"
28 if [[ $(uname) == "Darwin" ]]; then my_seq=$Darwin_seq;
29 else my_seq=$Linux_seq;
30 fi;
31
32
33 ## Process flags ##
34 forcepdf=
35 forcemask=
36 forceunpaper=
37 forceclean=
38 convertflags=
39 unpaperflags=
40 depthflags="-depth 1"
41 skipmask=
42 while getopts 'vd:sfpmuc' OPTION
43 do
44         case $OPTION in
45         v)  convertflags="$convertflags -verbose"
46                 unpaperflags="$unpaperflags -v --time"
47                 ;;
48         d)      depthflags="-depth $OPTARG"
49                 ;;
50         s)      skipmask=1;
51                 ;;
52         f)      forcepdf=1; forcemask=1; forceunpaper=1; forceclean=1
53                 ;;
54         p)      forcepdf=1; forcemask=1; forceunpaper=1; forceclean=1
55                 ;;
56         m)      forcemask=1; forceunpaper=1; forceclean=1
57                 ;;
58         u)      forceunpaper=1; forceclean=1
59                 ;;
60         t)      forceclean=1
61                 ;;
62 #       b)      bflag=1
63 #               bval="$OPTARG"
64 #               ;;
65         ?)      usage
66                 exit 2
67                 ;;
68         esac
69 done
70 shift $(($OPTIND - 1))
71
72 # check we have an input and output!
73 if [[ $# != 2 ]]; then
74         echo "Wrong number of parameters (2 required, $# given: [$@])" >&2
75         usage
76         exit 2
77 fi
78
79 file=$1
80 dir=$2
81
82 filedir=$(dirname $1)
83 base=$(basename $1 .pdf)
84
85 # make the output dir
86 mkdir -p $dir
87
88 # figure out the number of pages
89 dscname=$dir/${base}.dsc
90 pdf2dsc $file $dscname || exit 1
91 pages=$(awk '$1 ~ "%%Pages" {print $2}' $dscname)
92 echo "Got $pages page(s)."
93 rm $dscname
94
95 # process pages 1 by 1 to avoid convert gobbling all the memory
96 for pg in `$my_seq 1 $pages`; do
97         echo "Processing page $pg."
98         
99         pgn=$(printf '%03d' $pg)
100         
101         # convert from pdf
102         origpnm=$dir/pg-${pgn}.pnm
103         if [[ ! $([ -e $origpnm ]) || $forcepdf ]]; then
104                 convert $convertflags $depthflags -density 300 $file[$(expr $pg - 1)] \
105                         $origpnm || exit 1
106         fi;
107         
108         # preprocess it!
109         preppnm=$dir/pg-pp-${pgn}.pnm
110         if [[ ! $skipmask && ( ! $([ -e $preppnm ]) || $forcemask ) ]]; then
111                 # create mask: 
112                 # ... downscale, blur,
113                 convert $convertflags -resize 25% -depth 8 -blur 10 $origpnm $dir/pg-mask-${pgn}.pnm ||exit 1
114
115                 # ... get crop co-ords
116                 cropcords=$(convert -resize 400% -trim -fuzz 90% -format "%wx%h%O" $dir/pg-mask-${pgn}.pnm info: || exit 1)
117                 
118                 # ... crop and despeckle? the final pre-prepared image
119                 convert $convertflags -crop $cropcords $origpnm $preppnm || exit 1
120         elif [[ $skipmask ]]; then
121                 cp $origpnm $preppnm
122         fi;
123         
124         #unpaper it
125         #names go a bit funny here
126         #also, ignore flags starting here
127         unppnm=$dir/upg-${pgn}-%01d.pnm
128         unpaper $unpaperflags --layout double --overwrite --no-blackfilter -ni 10 -op 2 $preppnm $unppnm || exit 1
129
130         # final convert and clean
131         convert $convertflags $dir/upg-${pgn}-?.pnm $dir/upg-${pgn}-%01d.tiff || exit 1
132         
133         
134 done
135
136 mkdir $dir/pages
137 mv $dir/upg-*.tiff $dir/pages
138         

UCC git Repository :: git.ucc.asn.au