usr/local/bin/image2pdf 0000755 0000000 0000000 00000066472 11664656400 014042 0 ustar root root #! /bin/bash
oldpwd=`pwd`;
:ebug=$6
echo "$debug" | grep / || debug=$debug/tmp/.txt.pdf.$$/
tmp=/${debug#*/}
ls -d $tmp 2> /dev/null || mkdir $tmp
realres=${3:-300} # en dpi.
res=`echo $realres '*' 2 | bc -lq` # comme ca, on peut faire du a2.
echo "$0 $@"
{ test -e $tmp/b.png && convert $tmp/b.png info:- ; } || { convert -density ${res}x${res} $1 -quality 99 $tmp/b.png || { # verifier que l'image etait prete.
echo "Usage: $0" 'imageInputPATH [pdfOutputPATH] [inputDPI] [outputDPI] [outputquality] [[no]debug[/tmp/.txt]]
Combines optical character recognition softwares OCRopus, tesseract and cuneiform, and create a pdf file.
image2textonly-pdf imageInputPATH pdfOutputPATH inputDPI: includes no image. ¿ (utf8: ¿) tags some potential errors.
image2text-pdf imageInputPATH pdfOutputPATH inputDPI: same as above, adds image extracts at tags.
image2compressed-pdf imageInputPATH pdfOutputPATH inputDPI [outputDPI]: same as above, adds entire image at outputDPI (should be very low) and outputquality
image2pdf imageInputPATH pdfOutputPATH inputDPI: same as image2textonly-pdf, plus entire image at outputDPI and outputquality.
default args: '"$0" 'imageInputPATH res.pdf 300 0 0 nodebug
"0 0" means "`expr outputDPI / 6` 80", unless nocuneiform=1 image2pdf when it means "outputDPI 80"
if you do not plan to use acroread, xpdf or pdftotext, prefer `noxpdf=1 '"$0"'`.
Patch needed to create pdf of size greater than ISO standard A2 (width <= 420mm, height <= 594mm).
needs OCRopus-0.4 from http://ocropus.googlecode.com/files/ocropus-0.4.tar.gz with patch http://bugs.gentoo.org/show_bug.cgi?id=185810#c18
needs cuneiform (except if called by `nocuneiform=1 image2textonly-pdf`)
needs tesseract (except if called by `notesseract=1 '"$0"'`)
up to nine time recursive except if called with `notilt=1 '"$0"'`.
`autorotate=1 '"$0"'` will automatically rotate back imageInputPATH in place
`textvariants=1 '"$0"'` will add cuneiform, tesseract and OCRopus versions of any line (for better keyword search results)
`textvariantsconcatenes=1 '"$0"'` will concat cuneiform, tesseract and OCRopus versions of any line.
`noglobalcuneiform=1 '"$0"'` will resctrict cuneiform on lines images only.
of up to 2 or 3 degrees (incompatible with notilt=1 or multi-page input.
BUGS: There should be a lot of bugs, though I tested it a lot.
It is 400 lines of ugly shell code, with code duplication.
Options are read in environment variables, not in command line
patches, comments to dREPLACEeLETTEReEjBYeLETTEReA A T gmail D O T com or https://bugs.gentoo.org/show_bug.cgi?id=185810' >&2
exit 1
} ; }
# echo " -rotate 0 " # so that grep -rotate | tail -n 1 always gives something.
p=${4:-0}
case "${p}a" in
0a)
case "${0##*/}a" in
*compressed-pdfa) # ne mettre les pixels que dans les zones à erreur.
p=${4:-`echo $realres / 6 | bc -lq`} # dpi bas pour le format compressed-pdf . marche mieux si c'est un diviseur de $res.
;;
*pdfa)
p=${4:-$realres}
;;
esac
;;
esac
p=`echo $p / $realres '*' 100 | bc -lq` # mainteant en %.
case ${noxpdf:-no}a in
a|noa|0a) xpdf='-s' ;;
*) xpdf='' ;;
esac
case ${nocuneiform:-no}a in
a|noa|0a) nocuneiform=0 ;;
*) nocuneiform=1 ;;
esac
case ${noglobalcuneiform:-no}a in
a|noa|0a) noglobalcuneiform=0 ;;
*) noglobalcuneiform=1 ;;
esac
case ${notesseract:-no}a in
a|noa|0a) notesseract=0 ;;
*) notesseract=1 ;;
esac
case ${notilt:-no}a in
a|noa|0a) notilt='0' ;;
*) notilt='1' ;;
esac
case ${autorotate:-no}a in
a|noa|0a) autorotate='0' ;;
*) autorotate='1' ;;
esac
case ${tesslanguage}a in
a)
export tesslanguage=fra # default language is french.
# "eng" (anglais), "deu" (allemand), "ita" (italien), "spa" (espagnol) ou "nld" (néerlandais)
;;
esac
# ocropus can only be disabled when nocuneiforms is not set and $0 is textonly-pdf
cd $tmp
list=b.png
test -f b.png | list=b*.png
for page in $list ; do
mkdir -p $tmp/${page%.png}
cd $tmp/${page%.png}
cp ../$page b.png && echo " From $page to res${page%.png}-pdf"
size=`file b.png | sed -e 's:^[^0-9]*::' -e 's:,.*::'` # on peut aussi lire la taille avec convert b.png info:- ...
# size=`convert b.png info: | sed 's:b.png PNG \([0-9][0-9]*\)x\([0-9][0-9]*\) .*:\1 x \2:'`
paper=`echo ${size%% x*} '*' 72 / $res | bc -q`x`echo ${size##*x } '*' 72 / $res | bc -q`
angle=0.;
test -e angle || echo $angle > angle
case "${0##*/}${nocuneiform}${textvariants:-0}${textvariantsconcatenes:-0}a${notilt}`ls -d essai.ocropus 2> /dev/null`" in
*textonly-pdf000a1)
case "${nocuneiform}${noglobalcuneiform}"a"`ls cuneiform.hocr 2> /dev/null`" in
00a)
cuneiform -l ${tesslanguage/nld/dut} -f hocr -o cuneiform.hocr b.png # [-l languagename -f format --dotmatrix --fax -o result_file] imagefile # cuneiform -h et cuneiform -f donnent des choses. # --dotmatrix peut-etre utile pour les resultats de mesures imprimés.
;;
esac
;;
esac
case "${0##*/}`ls cuneiform.hocr 2> /dev/null`${nocuneiform}${textvariants:-0}${textvariantsconcatenes:-0}a${notilt}`ls -d essai.ocropus 2> /dev/null`" in
*textonly-pdfcuneiform.hocr000a1) ;;
*a?essai.ocropus) ;; # if essai.ocropus already exists, we assume that all that has been done.
*)
rm -rf essai.ocropus
ocropus book2pages essai.ocropus b.png
maxaspect=0 maxheight=10000 ocropus pages2lines essai.ocropus
test $notilt '=' 0 && {
{
echo 'tilt=[];lines(2000,2000);' # initialisation tilt et linewidth de scilab.
find essai.ocropus/*/. -name \*.png -print | while read pngfile ; do
cp $pngfile d.png
{
file d.png | sed -e 's:^[^0-9]*::' -e 's:,.*::' | sed -e 's/^/l=1:/' -e 's/x/;h=[1:/' -e 's/$/]'"'"';l=l-mean(l);d=zeros(h*l)'"'"';d(:)=256-[/'
# on peut remplacer file par convert (plus répétable), avec:
# size=`convert d.png info: | sed 's:d.png PNG \([0-9][0-9]*\)x\([0-9][0-9]*\) .*:l=1:\1;h=[1:\2]'"'"';l=l-mean(l);d=zeros(h*l)'"'"';d(:)=256-[\1 x \2:'`
convert -depth 8 d.png gray:- | od -v -An -w80 -tu1 | sed 's: :;:g' # imread n est pas facile a demander a scilab
echo '];d=d'"'"';"'"$pngfile"'";tilt($+1,1:2)=[-atan(sum(d.*(h*l))/sum(sum(d.*(ones(h)*l.^2))))/%pi*180,sum(d)];'
# angle for each line is computed
}
done
# wheighting by the surface of letters:
echo 'angle=0;' # failsafe.
echo 'disp(tilt);angle=sum(prod(tilt,2))/sum(tilt(:,2));' # weighted mean angle, convergence ends in small chaos
echo ';if abs(angle)<1e-3;angle=0;end;disp(angle)';
echo '[so,rt]=sort(tilt(:,1));angle=interp1([0;cumsum(tilt(rt,2))-tilt(rt,2)/2],[0;so],sum(tilt(rt,2))/2,"linear");' # weighted median angle
echo ';if abs(angle)<1e-3;angle=0;end;disp(angle)';
echo 'quit'
} | scilab -nw > scilaboutput
angle=`grep '[0-9]' scilaboutput | tail -n 1 | sed 's: *::g'`
test ${debug/debug*/debug} = debug || rm -rf $tmp/${page%.png}/[^b]*
echo $debug | grep 'tilted.*tilted.*tilted.*tilted.*tilted.*tilted.*tilted.*tilted.*tilted.*tilted' && angle=0.
echo $angle | grep '0\.000' && angle=0.
echo $angle > angle
}
test $angle '=' 0. && {
case "$1$autorotate$page" in
*-rotate*1b.png)
cd $oldpwd
convert $1 moved.${1%% *}
mv moved.${1%% *} ${1%% *}
cd $tmp/${page%.png}
;;
esac
maxaspect=0 maxheight=10000 ocropus lines2fsts essai.ocropus
ocropus fsts2text essai.ocropus
# on taggue avec ¿ (¿ en utf8) les caractère de cout superieur à deux.
find essai.ocropus -name \*.costs -print | while read costfile ; do
txt=${costfile%.costs}ocro.txt
test -f $txt || cp ${costfile%.costs}.txt $txt
paste -d, <(grep -v ' 0$' $costfile | sed -e '/ [2-9]\.\| 1[0-9]\./s:.*:1:' -e '/../s:.*:0:') <(sed 's:.:&\n:g' $txt | grep .) > $txt.paste
cp $txt.paste ${costfile%.costs}.paste
{
test $notesseract = 0 && convert ${costfile%.costs}.png b.bmp && tesseract b.bmp ${costfile%.costs}tess -l $tesslanguage # n'aime pas les tif 32 bits, donc je met des .bmp
} 2>&1 | tr '\012A' 'A\012' | sed -e 's:Tesseract Open Source OCR EngineA:.:' | tr '\012A' 'A\012'
{ # separation pour qu'il y ait moins de blocage du style http://bugs.gentoo.org/show_bug.cgi?id=234824#c26
test $nocuneiform = 0 && cuneiform -l ${tesslanguage/nld/dut} -f text -o ${costfile%.costs}cune.txt ${costfile%.costs}.png
} 2>&1 | tr '\012A' 'A\012' | sed -e 's:Cuneiform for Linux [.0-9]*A:_:' | tr '\012A' 'A\012'
# tess..flat cune ocro tess
test $notesseract = 0 && test $nocuneiform = 0 && diff -yW80 <(diff -yW35 <(recode -qf utf8..flat < ${costfile%.costs}tess.txt | sed 's:.:0,&\n:g' | grep ...) <(sed 's:.:0,&\n:g' ${costfile%.costs}cune.txt | grep ...)) <(diff -yW35 ${costfile%.costs}.paste <(sed 's:.:0,&\n:g' ${costfile%.costs}tess.txt | grep ...)) | tee $txt.diff4 | sed -e 's:\s\s*: :g' -e 's:\([01], \)\([^ ]\):\1 \2:g' -e 's:\([01], \)\([^ ]\):\1 \2:g' -e 's:^0,\(.\) 0,\1 0,\1 0,\1:ok parfait \1:' -e 's:^0,\(.\) 0,\1 | [01],. | 0,\1:ok cune_a_tord \1:' -e 's:^0,\(.\) 0,\1 | 0,. | 0,\(.\):ok caract_utf8_cune_d_accord \2:' -e 's:^ > > 0,\(.\):ok tess_caract_en_trop \1:' -e 's:^ > [01],. | 0,\(.\):ok tess_caract_en_trop_ocro_aussi \1:' -e 's:^ > 0,\(.\) 0,\1:ok oubli_de_cune \1:' -e 's:^ > [01],\(.\) <:non ocro_donne_trop \1:' -e 's:^0,. | 0,\(.\) | [01],\1 |.*:ok tess_a_tord \1:' -e 's:^0,| | 0,I | 0,l | 0,|:ok err l:' -e 's:^0,| | 0,I | 0,l | 0,|:ok err l:' -e 's:^0,\(.\) | 0,. | 0,\1 0,\1:ok cune_a_tord \1:' -e 's:^0,\(.\) 0,\1 | > 0,\1:ok oubli_de_ocro \1:' -e 's:^0,\(.\) | 0,. | 1,\1 | 0,\1:ok cune_a_tord_costs_aussi \1:' -e 's:0,\(.\) | 0,\(.\) 0,\1 | 0,\2:ok utf8_par_cune_aussi \2:' -e 's: > 0,\(.\) > 0,\1:ok utf8_par_cune_caract_en_trop \1:' -e 's:^0,\(.\) 0,\1 .*:ok tess_flat_et_cune \1:' -e 's:^[^onp].*\(.\):pas generic_error \1:' > $txt.merge4 && sed < $txt.merge4 -e 's:^ok.*\(.\):0,\1:' -e 's:^non.*\(.\)::' -e 's:^pas.*\(.\):1,\1:' > ${costfile%.costs}.paste
sed < ${costfile%.costs}.paste -e 's/0,¿/?/' -e 's/0,//' -e 's/1,.*/¿/' | tr 'a\012' '\012a' | sed -e 's:a::g' -e '$s:$:a:' | tr 'a\012' '\012a' | recode -f utf8..html | recode -f html..utf8 | tr '\000-\010\013-\037\100-\110\113-\137' '\100-\110\113-\137\000-\010\013-\037' | sed -e 's:[@-HK-_]: :g' -e 's:&:\&:g' -e 's:<:\<:g' -e 's:>:\>:g' | tr '\000-\010\013-\037\100-\110\113-\137' '\100-\110\113-\137\000-\010\013-\037' > ${costfile%.costs}.txt
done
ocropus buildhtml essai.ocropus 2> errs | tr 'A\012' '\012A' | sed 's% Transitional//ENA http://www%Transitional//EN"A "http://www%' | tr 'A\012' '\012A' > hocr.html ; cat errs
grep FATAL errs >/dev/null && echo ' + +
+ + + + +OCR Output + + + +
+ +' | tr '+' '\n' > hocr.html
hocrtopdf hocr.html Helvetica hocrHelvetica.pdf ${res} ${res} ${size%% x*} ${size##*x } 0
find essai.ocropus -name \*.costs -print | while read costfile ; do
grep '¿' ${costfile%.costs}.txt > /dev/null || rm ${costfile%.costs}.txt # et on ne met pas les lignes correctes
done
ocropus buildhtml essai.ocropus 2> errs | tr 'A\012' '\012A' | sed 's% Transitional//ENA http://www%Transitional//EN"A "http://www%' | tr 'A\012' '\012A' > hocrtagge.html ; cat errs
grep FATAL errs >/dev/null && echo ' + + + + + + +OCR Output + + + +
+ +' | tr '+' '\n' > hocrtagge.html
# on fait variere la position de ces caractères taggés.
for font in Helvetica Courier ; do
hocrtopdf hocrtagge.html $font hocrtagge$font.pdf ${res} ${res} ${size%% x*} ${size##*x } 0
DISPLAY= acroread -toPostScript -size $paper hocrtagge$font.pdf # pour ne plus laisser de liberte aux caractères.# acroread lance gconftool-2 -g /desktop/gnome/interface/accessibility qui n'est pas parallélisable avec lui-meme :-( car /usr/libexec/gconfd-2 4 peut se recevoir un sigstop de groupe de processus.
for i in M Z '?' '¿' ; do
f=`echo "$i" | tr '?¿' Ii`
sed -e 's:\\277:¿:' -e 's:^(\(.*¿.*\))$:¿\1¿:' -e '/^¿/s:\\[0-9][0-9][0-9]: :g' -e '/^¿/s:[^¿]: :g' -e '/^¿/s:\(.\)¿:\1'$i:g -e '/^¿/s:\(.\)¿:\1'$i:g -e 's:^¿\(.*'$i'.*\)'$i':(\1):' hocrtagge$font.ps > b.ps
ps2pdf -dDEVICEWIDTHPOINTS=${paper%x*} -dDEVICEHEIGHTPOINTS=${paper#*x} b.ps > /dev/null
mv b.pdf b$font$f.pdf
echo b$font$f.pdf
done
done | { cat ; echo cat ; echo output ; echo b.pdf ; } | xargs pdftk
pdftk bCourieri.pdf background bHelveticai.pdf output II.pdf
}
;;
esac
case "${0##*/}${nocuneiform}${textvariants:-0}${textvariantsconcatenes:-0}a${notilt}" in
*textonly-pdf000a1) ;;
*a0)
test $notilt '=' 0 && {
angle=`cat angle`
cat angle | grep '^0\.$' || {
name="$1"
test $page '=' b.png && cd $oldpwd || {
name=b.png
}
case "$name" in
*-rotate*)
angle=`echo $angle +'('${name##* -rotate }')' | bc -lq`
name=${name%% -rotate *}
;;
esac
case "$angle" in
*[2-9].*|*[1-9][0-9].*)
angle=0. # more that 2 degrees: there is a bug, we will not turn anything.
export notilt=1;
;;
esac
$0 "$name -rotate $angle" $tmp/${page%.png}/tex.pdf "$3" "$4" "$5" "$debug/tilted${page%.png}"
angle=10. # juste pour ne pas refaire ceci.
# test ${debug/debug*/debug} = debug || rm -rf $tmp/${page%.png}/[^b]*
# $tmp/${page%.png}
# mv $tmp/tilted${page%.png}/b/res.pdf $tmp/${page%.png}/ # pour contrer le bug maintenant patché dans latex ...
cd $tmp/${page%.png}
}
}
;; # if essai.ocropus already exists, we assume that all that has been done.
esac
# on fait le bilan sur une seule page de tous les caractères taggés.
test $angle '=' 0. && {
rm res.pdf
case "${nocuneiform}"a"`ls cuneiform.hocr 2> /dev/null`" in
0a)
cuneiform -l $tesslanguage -f hocr -o cuneiform.hocr b.png # [-l languagename -f format --dotmatrix --fax -o result_file] imagefile # cuneiform -h et cuneiform -f donnent des choses. # --dotmatrix peut-etre utile pour les resultats de mesures imprimés.
;;
esac
case "${0##*/}a`ls f.pdf 2> /dev/null`" in
*af.pdf) ;;
*text-pdfa|*compressed-pdfa)
pdftops b.pdf
pstops 8:0+1+2+3+4+5+6+7 b.ps c.ps
# on découpe une large zone autour de ces tags. cette ligne prend 30% du temps. TODO essayer de accélérer ceci en travaillant à des résolutions dégradées de 1/4 par exemple.
convert -alpha Off -units PixelsPerInch -density ${res}x${res} c.ps -crop ${size/ x /x}'+0+0' -depth 16 -blur 0x5 -black-threshold '90%' -blur 0x8 -threshold '80%' -negate c.png # +0+0 pour ne pas que cela cree c-0.png, c-1.png, ...
# c.png contient maintenant en noir les zones avec erreur.
convert c.png -negate -blur 8x8 -threshold '99%' d.png
composite -compose plus b.png d.png -quality ${5:-80} f.gif # on efface les zones hors erreur
#convert f.gif -density ${res}x${res} f.pdf # fait un pdf trop gros.
#convert f.gif -density ${res}x${res} eps2:f.eps ; ps2pdf f.eps # donne le plus petit f.pdf possible, mais décalé :-(
# pas possible de faire un f avec matte channel assez petit sans que ce soit (.gif) avec des ronds autour des trous.
convert f.gif -units PixelsPerInch -density ${res}x${res} eps2:f.eps
ps2pdf -dDEVICEWIDTHPOINTS=${paper%x*} -dDEVICEHEIGHTPOINTS=${paper#*x} f.eps # ok cree f.pdf
;;
esac
# bug: when cuneiform fails, it creates cuneiform.hocr nonetheless.
test -f cuneiform.hocr || nocuneiform=1 # cuneiform failed
case "${0##*/}a" in
*textonly-pdfa) # ne mettre les pixels que dans les zones à erreur.
rm res.pdf
test "$nocuneiform" = '0' &&
hocr2pdf -i b.png -r $res -n $xpdf -o res.pdf < cuneiform.hocr 2> hocr2pdf.err && # tres bon pour faire mon image2text.pdf sauf qu'il ne met pas de figure ; n'a pas de notion de "confidence" ... "Unhandled bps/spp combination." est causé par exactimage employé dans ce hocr2pdf.
cat hocr2pdf.err &&
test '!' -s hocr2pdf.err ||
cp hocrHelvetica.pdf res.pdf
;;
*compressed-pdfa) # pour faire des .pdf plus petits.
rm cuneiform.pdf
test "$nocuneiform" = '0' &&
hocr2pdf -i b.png -r $res -n $xpdf -o cuneiform.pdf < cuneiform.hocr 2> hocr2pdf.err &&
cat hocr2pdf.err &&
test '!' -s hocr2pdf.err && # may fail with "Unhandled bps/spp combination." (from exact-image)
pdftk cuneiform.pdf background II.pdf output i.pdf ||
cp hocrHelvetica.pdf i.pdf
convert c.png -resize $p%x$p% -threshold '50%' -negate -alpha Copy e.png
convert e.png -alpha Extract -negate -alpha Copy -units PixelsPerInch -density `echo ${res} / 100 '*' $p | bc -q`x`echo ${res} / 100 '*' $p | bc -q` e.pdf
composite -compose plus b.png c.png -resize $p%x$p% g.png # puis on efface les zones d'erreur (sinon, convert vers pdf n'arrive pas à les rendre transparentes)
composite -compose Dst_In e.png g.png -matte h.png # puis on rend transparentes (sans les effacer) les zones d'erreur
convert h.png -quality ${5:-50} h.gif
convert h.gif -units PixelsPerInch -density `echo ${res} / 100 '*' $p | bc -q`x`echo ${res} / 100 '*' $p | bc -q` h.pdf
pdftk h.pdf background f.pdf output hf.pdf # bon il y a des trous qui apparaissent à l'écran :-(
pdftk hf.pdf background i.pdf output res.pdf # tres bon pour faire un image2textcompressed.pdf avecresolutionimagereduite sauf aux erreurs de reconnaissance de OCRopus.
;;
*text-pdfa) # ne mettre les pixels que dans les zones à erreur.
rm cuneiform.pdf
test "$nocuneiform" = '0' &&
hocr2pdf -i b.png -r $res -n $xpdf -o cuneiform.pdf < cuneiform.hocr 2> hocr2pdf.err && # tres bon pour faire mon image2text.pdf sauf qu'il ne met pas de figure ; n'a pas de notion de "confidence" ...# -r $res: pour eviter "Warning: Image x/y resolution not set, defaulting to:"
cat hocr2pdf.err &&
test '!' -s hocr2pdf.err &&
pdftk cuneiform.pdf background II.pdf output i.pdf ||
cp II.pdf i.pdf
# todo mettre les ¿ dans le texte mais sans la fonte pour les mettre.
# pour cela, remplacer ¿ (¿) par ÿ (ÿ)
find essai.ocropus -name \*.costs -print | while read costfile ; do
sed < ${costfile%.costs}.paste -e 's/0,¿/?/' -e 's/0,//' -e 's/1,.*/¿/' -e 's:¿:ÿ:' | tr 'a\012' '\012a' | sed -e 's:a::g' -e '$s:$:a:' | tr 'a\012' '\012a' | recode -f utf8..html | recode -f html..utf8 | tr '\000-\010\013-\037\100-\110\113-\137' '\100-\110\113-\137\000-\010\013-\037' | sed -e 's:[@-HK-_]: :g' -e 's:&:\&:g' -e 's:<:\<:g' -e 's:>:\>:g' | tr '\000-\010\013-\037\100-\110\113-\137' '\100-\110\113-\137\000-\010\013-\037' > ${costfile%.costs}.txt
done
ocropus buildhtml essai.ocropus 2> errs | tr 'A\012' '\012A' | sed 's% Transitional//ENA http://www%Transitional//EN"A "http://www%' | tr 'A\012' '\012A' > barres_encadrant_erreurs.html ; cat errs
grep FATAL errs >/dev/null && echo ' + + + + + + +OCR Output + + + +
+ +' | tr '+' '\n' > barres_encadrant_erreurs.html
font=Helvetica
hocrtopdf barres_encadrant_erreurs.html $font barres_encadrant_erreurs$font.pdf ${res} ${res} ${size%% x*} ${size##*x } 1
DISPLAY= acroread -toPostScript -size $paper barres_encadrant_erreurs$font.pdf # pour ne plus laisser de liberte aux caractères.
# et ici, on corrige en remettant le ¿ à la place de ÿ ( \177 ici :-( ), qui n'apparaitra pas mais sera copier-collable.
sed -e 's:\\177:\\277:g' < barres_encadrant_erreursHelvetica.ps > b.ps ; ps2pdf -dDEVICEWIDTHPOINTS=${paper%x*} -dDEVICEHEIGHTPOINTS=${paper#*x} b.ps ; mv b.pdf quebon.pdf
# pdftk ef.pdf background ii.pdf output res.pdf # assez bon pour faire un txt.pdf, ce qu'il y a de mieux pour imprimer, mais mauvaise reconaissance de caracteres quand meme ; donc pas très copier-collable.
case "$nocuneiform"a in
0a)
pdf2ps quebon.pdf
mv quebon.ps quebonsansfonte.ps
ps2pdf -dDEVICEWIDTHPOINTS=${paper%x*} -dDEVICEHEIGHTPOINTS=${paper#*x} quebonsansfonte.ps ;
pdftk quebonsansfonte.pdf background f.pdf output ef.pdf
pdftk ef.pdf background i.pdf output res.pdf # assez bon pour faire un txt.pdf, ce qu'il y a de mieux pour imprimer, très bonne reconnaissance de caractères, mais ce qui est copié-collé n'est pas forcément ce qui est écrit :-( bon on va dire que si ca ira.
;;
1a)
pdftk quebon.pdf background f.pdf output res.pdf # assez bon pour faire un txt.pdf, ce qu'il y a de mieux pour imprimer, le copié-collé fait une assez bonne reconnaissance de caractères, et la très bonne reconnaissance de caractères est stocké en fichier attaché.
;;
esac
;;
*pdfa) # gros pdf avec tout les pixels scannes.
rm cuneiform.pdf
test "$nocuneiform" = '0' &&
hocr2pdf -i b.png $xpdf -r $res -o cuneiform.pdf < cuneiform.hocr 2> hocr2pdf.err && # marche pas pour toutes les résolutions avec images vides.
cat hocr2pdf.err &&
test '!' -s hocr2pdf.err &&
pdftk cuneiform.pdf background II.pdf output res.pdf || {
convert b.png -resize $p%x$p% -quality ${5:-80} a.jpg
# -units PixelsPerCentimeter est ici la valeur par défaut :-(
convert -units PixelsPerInch -density `echo ${res} / 100 '*' $p | bc -q`x`echo ${res} / 100 '*' $p | bc -q` a.jpg eps2:a.eps
ps2pdf -dDEVICEWIDTHPOINTS=${paper%x*} -dDEVICEHEIGHTPOINTS=${paper#*x} a.eps # ok cree a.pdf
pdftk a.pdf background hocrHelvetica.pdf output res.pdf
}
# pdftk e.pdf background f.pdf output ef.pdf
# pdftk f.pdf background i.pdf output res.pdf # moyen pour faire un txt.pdf # pour faire mieux, il faudrait virer les caratères litigieux de cuneiform.hocr mais c'est très difficile sans information de cout la-bas. Par contre, c'est plus facilement copier-collable, mais avec oubli des erreurs.
;;
esac
test ${textvariants:-0} '=' 1 && {
for format in ocro cune tess ; do
find essai.ocropus -name \*.costs -print | while read costfile ; do
cat ${costfile%.costs}$format.txt | recode -f utf8..html | recode -f html..utf8 | tr '\000-\010\013-\037\100-\110\113-\137' '\100-\110\113-\137\000-\010\013-\037' | sed -e 's:[@-HK-_]: :g' -e 's:&:\&:g' -e 's:<:\<:g' -e 's:>:\>:g' | tr '\000-\010\013-\037\100-\110\113-\137' '\100-\110\113-\137\000-\010\013-\037' > ${costfile%.costs}.txt
done
ocropus buildhtml essai.ocropus 2> errs | tr 'A\012' '\012A' | sed 's% Transitional//ENA http://www%Transitional//EN"A "http://www%' | tr 'A\012' '\012A' > textvariants$format.html ; cat errs
grep FATAL errs >/dev/null && echo ' + + + + + + +OCR Output + + + +
+ +' | tr '+' '\n' > textvariants$format.html
font=Helvetica
hocrtopdf textvariants$format.html $font textvariants.pdf ${res} ${res} ${size%% x*} ${size##*x } 1
mv res.pdf res2.pdf
pdftk res2.pdf background textvariants.pdf output res.pdf
rm res2.pdf
done
}
test ${textvariantsconcatenes:-0} '=' 1 && {
find essai.ocropus -name \*.costs -print | while read costfile ; do
{
for format in ocro cune tess ; do
cat ${costfile%.costs}$format.txt | tr '\012' ' '
echo -n " "
done
echo
} | recode -f utf8..html | recode -f html..utf8 | tr '\000-\010\013-\037\100-\110\113-\137' '\100-\110\113-\137\000-\010\013-\037' | sed -e 's:[@-HK-_]: :g' -e 's:&:\&:g' -e 's:<:\<:g' -e 's:>:\>:g' | tr '\000-\010\013-\037\100-\110\113-\137' '\100-\110\113-\137\000-\010\013-\037' > ${costfile%.costs}.txt
done
ocropus buildhtml essai.ocropus 2> errs | tr 'A\012' '\012A' | sed 's% Transitional//ENA http://www%Transitional//EN"A "http://www%' | tr 'A\012' '\012A' > textvariantsconcatenes.html ; cat errs
grep FATAL errs >/dev/null && echo ' + + + + + + +OCR Output + + + +
+ +' | tr '+' '\n' > textvariantsconcatenes.html
font=Helvetica
hocrtopdf textvariantsconcatenes.html $font textvariantsconcatenes.pdf ${res} ${res} ${size%% x*} ${size##*x } 1
mv res.pdf res2.pdf
pdftk res2.pdf background textvariantsconcatenes.pdf output res.pdf
rm res2.pdf
}
#pdfnup marche mieux ... bon ben je m'en inspire.
# eh ben ca me coupe les pages trop grandes :-(
# deconne pour ce qui est trop grand :-(
echo '\documentclass[auto]{article} \usepackage{pdfpages} \setlength{\pdfpagewidth}{'`echo ${size%% x*} '*' 72 / $realres | bc -lq`'pt} \setlength{\pdfpageheight}{'`echo ${size##*x } '*' 72 / $realres | bc -q`'pt} \begin{document} \includepdf[pages=-,nup=1x1,frame=false,fitpaper=true,trim=0 0 0 0,delta=0 0,offset='`echo ${size%% x*} '*' 36 / $realres - 307 | bc -lq`' '`echo 396.5 - ${size##*x } '*' 36 / $realres | bc -q`',scale=2,turn=true,noautoscale=true,column=false,columnstrict=false,openright=false]{res.pdf}\end{document}' > tex.tex
pdflatex tex.tex
}
mv tex.pdf ../res${page%.png}.pdf
#pdftops -paperw `echo ${size%% x*} '*' 72 / $realres | bc -q` -paperh `echo ${size##*x } '*' 72 / $realres | bc -q` -expand res.pdf
#mv res.ps res${page%.png}.ps
#ps2pdf -dDEVICEWIDTHPOINTS=`echo ${size%% x*} '*' 72 / $realres | bc -q` -dDEVICEHEIGHTPOINTS=`echo ${size%% x*} '*' 72 / $realres | bc -q` res${page%.png}.ps # on voit que la feuille a bien doublé, voir dans le preview de acroread, la mention "document size". # marche pas :-(
done
cd $tmp
test "$list" = "b.png" || pdftk resb*.pdf cat output resb.pdf
cd $oldpwd
mv $tmp/resb.pdf ${2:-res.pdf}
ls -l ${2:-res.pdf} | grep -v '/tmp/\.txt\.pdf'
test ${debug/debug*/debug} = debug || rm -rf $tmp
usr/local/bin/.post.scan 0000755 0000000 0000000 00000123417 11664667603 014172 0 ustar root root #! /bin/bash
server=samba_name # samba server name
share=smbNam # samba account name
domain=`dnsdomainname`
sender=$USER@$domain
hostname=`hostname`.$domain
smtp=smtp.$domain
httpdestdir=~/ComsolDVD/hidden/scans
# annuaire créé avec xls2csv Annuaire\ diffusion\ 01.02.10.xls | cut -d, -f3,6-7 | sed -e 's:,:\t:' -e 's:[,"]::g' | grep '^[0-9].*@', puis on remplace 3, par 4, puis par 5,.
# chmod 711 ~/ComsolDVD/hidden/scans
export PATH=/usr/local/bin:/usr/bin:/bin:/opt/bin
##################### End of config. ##############################
# patches, comments to dREPLACEeLETTEReEjBYeLETTEReA A T gmail D O T com or https://bugs.gentoo.org/show_bug.cgi?id=185810' >&2
# marche bien lorsque le bouquin scanné n'a pas de tampon sur la tranche latérale intérieure, lorsque le livre est assez appuyé et les pages montrées un peu avancée pour que tout le texte soit hors de l'ombre entre deux pages.
cd $HOME/scans
case "a$2" in
a)
# Supported languages: eng ger fra rus swe spa ita ruseng ukr srp hrv pol dan por dut cze rum hun bul slo lav lit est tur.
echo 'syntaxe : bin/.post.scan 118e 5188a10b resolution'
# ~/bin/.future.post.scan 2e 5188a121501274a21a7a844244a10a71013598a752b 300
# ~/bin/.future.post.scan 2e 5188a121501274a21a7a844244a10b 300
# echo 'a10 fichiers déja transférés sur $hostname, pour débeugage'
echo 'a100 document en francais (implicite)'
echo 'a101 document en anglais britanique'
echo 'a102 document en anglais américain'
echo 'a103 document en néerlandais ou flamand'
echo 'a11 format .pdf avec texte copier-collable avec quelques figures (plus petit)'
echo 'a12 format .pdf avec texte copier-collable et images intactes (implicite)'
echo 'a121501274 idem, les images sont seulement en 150dpi et compressées à 74% (éviter 12%)'
echo 'ÿ si >100%, ce 1 initial signifie qu on laisse les figures en résolution native'
echo 'a13 format .doc pour microsoft word'
echo 'a14 format .txt'
echo 'a141 format .pdf sans aucune image'
echo 'a142 format .pdf sans aucune image, autre reconnaisseur de texte.'
echo 'a143 format .pdf sans aucune image mais superposant toutes variantes du texte'
echo 'a144 format .pdf sans aucune image mais entassant toutes variantes du texte'
echo 'a145 synonyme de a141a142a143a144'
echo 'a15 format .html'
echo 'a16 format .html optimise pour microsoft internet explorer'
echo 'a17 format .html optimise pour netscape'
echo 'a18 format .wp pour word perfect'
echo 'a190 format .tiff'
echo 'a191 format .mng'
echo 'a192 format .jpg (un fichier par image)'
echo 'a193 format .csv (comma separated text)'
echo 'a194 envoyer a l imprimante'
echo 'a1940 envoyer a l imprimante, recto verso'
echo 'a1941 envoyer a l imprimante, recto simple'
echo 'a1942 envoyer a l imprimante, deux pages par page, recto verso'
echo 'a1943 envoyer a l imprimante, pour les documents mono-colonne, quatre pages par page, recto verso'
echo 'a1944 envoyer a l imprimante, quatre pages par page, recto verso'
echo 'a1945 tout préparer mais ne pas envoyer à l imprimante en C204'
echo 'a1949 imprimer des images au format landscape'
echo 'a21 ne pas envoyer les fichiers par e-mail, ils restent sur 172.16.3.16.'
echo 'a24 de plus, les laisser un jour sur samba:\\\\172.16.3.16\\'
echo 'a25 de plus, les laisser dix jour sur samba:\\\\172.16.3.16\\'
echo 'a26 ne pas effacer toutes les traces de ce scan, même si le réseau marche.'
echo 'a260 effacer le plus fort possible toutes les traces de ce scan.'
echo 'a27 activer le debug de la reconnaissance des caractères.'
echo 'a28 utiliser le logiciel cuneiform sur toute la page (retarde l e-mail).'
echo 'a411 elements tres clairs a tirer vers le blanc (4110 implicite)'
echo 'a4199 elements tres fonces a tirer aussi vers le blanc (410 a 4199 possible)'
echo 'a421 elements tres fonces a tirer vers le noir (4265 implicite)'
echo 'a4299 elements tres clairs a tirer aussi vers le noir (420 a 4299 possible)'
echo 'a601 la première page de texte est à ignorer (a6 ne peut pas venir après)'
echo 'a6023 les 23 premières pages de texte sont à ignorer (601 à 60999 poss.)'
echo 'a6001 la dernière page de texte est à ignorer (a6 et a60 ne peuvent pas venir après)'
echo 'a60023 les 23 dernières pages de texte sont à ignorer (6001 à 600999 poss.)'
echo 'a7 document horizontal posé à l endroit devant vous (sinon, suivre le'
echo 'ÿ sigle HP pour l orientation de vos feuilles au format portrait)'
echo 'a71 il faut aussi tourner le document de 180 degrés.'
echo 'a7123 il faut aussi tourner le document de 23 degrés. (711 à 71359 poss.)'
echo 'a710234 il faut aussi tourner le document de 34/10^2 degrés. (sens antihoraire)'
echo 'a710 désactivation du redressement automatique de 2-3 degrés (a préciser avant a71)'
echo 'a72 il faut aussi tourner les pages paires du document de 180 degrés.'
echo 'a75 dans les formats PDF et imprimante, couper ce qui n est pas du texte'
echo 'a752 a75, mais il y a deux pages de texte côte à côte par page à scanner'
echo 'a753 a75, mais il y a deux pages de texte dessus-dessous par page à scanner'
echo 'a754 a75, mais il y a quatre pages de texte par page à scanner'
echo 'a755 a75, mais il y a quatre pages de texte en deux colonnes par page à scanner'
echo 'a75623 deux pages de texte ne peuvent pas avoir ensemble moins de 23 mm de large'
echo 'a75723 deux pages de texte ne peuvent pas avoir ensemble moins de 23 mm de haut'
echo 'a75823 a75 et ajouter 23 milimètres à la droite de chaque page de texte'
echo 'a8123 si vous voulez donner le nom 123 a votre fichier (longueur libre)'
echo 'a9456 si vous voulez donner le nom gjm a votre fichier (code : SMS)'
exit 45
;;
esac
echo $0 "$@"
# dix minutes maxi pour tout exécutable cuneiform:
ps auxwwwf | grep sl[eee]ep' 600.192837465' || { { cd /proc/self ; while sleep 600.192837465 ; do cat cmdline stat | grep -a cuneiform && cat stat | sed 's: .*::' | xargs -r kill ; cd /proc/`fuser /usr/bin/cuneiform | sed 's:.* ::'` ; done ; } & }
case "$2" in
*a28[ab]*)
;;
*)
export noglobalcuneiform=1
;;
esac
nom=b
case "$2" in
*a8[0-9]*)
nom=${2##*a8}
nom=${nom%%[ab]*}_
echo nom : $nom
;;
esac
case "$2" in
*a9[0-9]*)
nom=${2##*a9}
nom=${nom%%[ab]*}
nom=`echo $nom | sed -e 's:\([0-9]\)\1\1\1\1\1*:f\1:g' | sed -e 's:\([0-9]\)\1\1\1:e\1:g' | sed -e 's:\([0-9]\)\1\1:d\1:g' | sed -e 's:\([0-9]\)\1:c\1:g' | sed -e 's:^\([0-9]\):b\1:g' | sed -e 's:\([0-9]\)\([0-9]\):\1b\2:g' | sed -e 's:\([0-9]\)\([0-9]\):\1b\2:g' | tr 'b-f' '4-8' | sed 's:..: &, :g' | recode d..data | tr '(-Y' '_.adgjmptw:*behknqux0,cfilorvy0123456s8z0123456789' | sed 's/://g' | tr '*' '-'`_
echo nom : $nom
;;
esac
noxpdf=0;
_notilt=0;
case "$2" in
*a710[ab]|*a752710[ab])
export notilt=1;
_notilt=1;
;;
esac
rotatepaysage=''
case "$2" in
*a71[0-9][0-9]*|*a71[1-9]*)
rotatepaysage=${2##*a71}
rotatepaysage=${rotatepaysage%%[ab]*}
case "a$rotatepaysage" in
a0*)
echo ${rotatepaysage##0?}/10^${rotatepaysage:1:1}
rotatepaysage=`echo ${rotatepaysage##0?}/10^${rotatepaysage:1:1} | bc -lq`
;;
esac
case "$2" in
*a7[ab]*)
rotatepaysage=" -rotate -`echo 90+${rotatepaysage} | bc -lq`"
;;
*)
rotatepaysage=" -rotate -${rotatepaysage}"
;;
esac
;;
*a71[ab]*)
case "$2" in
*a7[ab]*)
rotatepaysage=" -rotate -270 "
echo rotatepaysage : $rotatepaysage
;;
*)
rotatepaysage=" -rotate -180 "
echo rotatepaysage : $rotatepaysage
;;
esac
;;
*)
case "$2" in
*a7[ab]*)
rotatepaysage=" -rotate -90 "
echo rotatepaysage : $rotatepaysage
;;
esac
;;
esac
rotatepaysagepair="$rotatepaysage";
case "$2" in
*a72[ab]*)
rotatepaysagepair=" -rotate `echo ${rotatepaysage# -rotate }-180 | bc -lq`"
echo rotatepaysagepair : $rotatepaysagepair
;;
esac
clairplusblanc='10'
fonceplusnoir='65'
case "$2" in
*a4[ab]*)
clairplusblanc=0
fonceplusnoir=0
;;
esac
case "$2" in
*a41[0-9]*[ab]*)
clairplusblanc=${2##*a41}
clairplusblanc=${clairplusblanc%%[ab]*}
;;
esac
case "$2" in
*a42[0-9]*[ab]*)
fonceplusnoir=${2##*a42}
fonceplusnoir=${fonceplusnoir%%[ab]*}
;;
esac
case "u`expr $clairplusblanc + $fonceplusnoir`" in
u1[0-9][0-9])
optionlevel='-negate -level '`expr 100 - $fonceplusnoir`'%,'$clairplusblanc'%'
;;
*)
optionlevel='-level '$fonceplusnoir'%,'`expr 100 - $clairplusblanc`'%'
;;
esac
tesslanguage=fra
case "$2" in
*a101*)
tesslanguage=eng
;;
*a102*)
tesslanguage=eng
;;
*a103*)
tesslanguage=nld
;;
esac
debug=nodebug
case "$2" in
*a27*)
debug=debug
;;
esac
export tesslanguage
{ echo "$2" | grep 'a10[ab]' ; } || tar xf -
{ {
echo $0 "$@"
cd $1
domv=1
echo -n '_' ; echo "$2" | grep 'a75[2-5][ab]' >/dev/null && echo "$2" | grep -v 'a75[ab]' >/dev/null && { domv=0 ; _notilt=1 ; noxpdf=1 ; }
case $domv in
1)
# Hint: it is save to rename .ppm files with format .ppm into .pnm files.
nbpages=`echo $1?.pnm $1??.pnm $1???.pnm $1????.pnm $1?????.pnm $1?.jpg $1??.jpg $1???.jpg $1????.jpg $1?????.jpg | tr ' ' '\012' | grep $1 | grep -v '?' | wc -l`
echo nbpages1 : "$nbpages"
iout=0
no=$nbpages.pnm
echo "$2" | grep 'a60[1-9]' >/dev/null && { iout=${2#*a60} ; iout=${iout%%[ab]*} ; for i in $1?.pnm $1??.pnm $1???.pnm $1????.pnm $1?????.pnm $1?.jpg $1??.jpg $1???.jpg $1????.jpg $1?????.jpg ; do no=${i##$1} ; mv $i $1`echo ${no%.*}-$iout | bc -q`.${no#*.} ; done ; mkdir efface ; mv ${1}0.* ${1}-*.* efface 2> /dev/null ; }
nbrm=0 ; echo "$2" | grep 'a600' >/dev/null && nbrm=${2#*a600} && mkdir -p efface ; nbrm=${nbrm%%[ab]*} ; for i in `seq 1 1 $nbrm` ; do mv ${1}`echo ${no%.*}-$iout-$i+1 | bc -q`.${no#*.} efface ; done
# older *75 results should be recomputed.
mkdir tailles
mv *.tailles tailles
;;
esac
nbpages=`echo $1?.pnm $1??.pnm $1???.pnm $1????.pnm $1?????.pnm $1?.jpg $1??.jpg $1???.jpg $1????.jpg $1?????.jpg | tr ' ' '\012' | grep $1 | grep -v '?' | wc -l`
echo nbpages : "$nbpages"
#100000 images ça suffit.
argconvert=`echo $1?.pnm $1??.pnm $1???.pnm $1????.pnm $1?????.pnm $1?.jpg $1??.jpg $1???.jpg $1????.jpg $1?????.jpg | tr ' ' '\012' | grep $1 | grep -v '?' | sed 's:^:-density '$3'x'$3' :' | tr '\012' ' '`
listefichiers=`echo $1?.pnm $1??.pnm $1???.pnm $1????.pnm $1?????.pnm $1?.jpg $1??.jpg $1???.jpg $1????.jpg $1?????.jpg | tr ' ' '\012' | grep $1 | grep -v '?' | tr '\012' ' '`
case "a`echo "$2" | grep 'a1\(\([35-8]\)\|\(9[035-7]\)\)*[ab]' > /dev/null && echo veuttiff`" in
aveuttiff*)
convert `echo $argconvert | sed -e 's:\([^ ]*\) \([^ ]*\) :\1 \2\x0a:g' -e "s: :$rotatepaysagepair :" -e 's:^:'"$rotatepaysage ": | xargs -r | tr '\012' ' '` $optionlevel -density $3x$3 b.tiff
;;
*)
echo pas besoin d un fichier tiff global.
;;
esac
listeenvois="../modemploi.txt";
enplus=0
maxxfin=0;
test -e decoupe/maxx && maxxfin=`cat decoupe/maxx`
echo -n '_' ; echo "$2" | grep 'a756' >/dev/null && { maxxfin=${2##*a756}; maxxfin=`echo ${maxxfin%%[ab]*} '* 842 / 297' | bc -lq`; }
echo maxxfin: $maxxfin
maxyfin=0;
test -e decoupe/maxy && maxyfin=`cat decoupe/maxy`
echo -n '_' ; echo "$2" | grep 'a757' >/dev/null && { maxyfin=${2##*a757}; maxyfin=`echo ${maxyfin%%[ab]*} '* 842 / 297' | bc -lq` ; }
echo maxyfin: $maxyfin
echo -n '_' ; echo "$2" | grep 'a758' >/dev/null && { enplus=${2##*a758}; enplus=${enplus%%[ab]*} ; }
echo enplus: $enplus
bintiff=/usr/local/bin/
# bintiff=~/bin/make. # a decommenter si on se satisfait d'un fichier txt.pdf antérieur, genre pour debug. Et ne marche pas pour plus d'une page :-(
echo -n '_' ; { { echo "$domv$2" | grep 'a1[124]\|a75' >/dev/null ; } || { echo "$domv$2" | grep '^1' | grep -v 'a1[1-9]' >/dev/null ; } ; } && { r1="$rotatepaysagepair"; r2="$rotatepaysage"; for i in $listefichiers ;
do r0="$r1"; r1="$r2"; r2="$r0";
echo "convert -density $3x$3 $i $r1 $optionlevel m.png"
# convert -density $3x$3 $i $r1 $optionlevel m.tiff : bug: ce qui devient noir est montré en blanc.
convert -density $3x$3 $i $r1 $optionlevel m.png
{ { echo "$domv$2" | grep 'a1[124]\|a75' >/dev/null ; } || { echo "$domv$2" | grep '^1' | grep -v 'a1[1-9]' >/dev/null ; } ; } && { noxpdf=$noxpdf notilt=$_notilt ${bintiff}image2text-pdf m.png ${i}txt.pdf $3 0 0 "debug`pwd`/image2txt$i" ; } # on pourrait aussi appeler image2txtonly-pdf ... plus besoin alors de pdf2psnoimage. Mais c'est image2text-pdf qui casse sa sortie .pdf, donc je préfère utiliser son b/res.pdf :-(
{ echo "$domv$2" | grep '^1.*a14[ab]' >/dev/null ; } && { pdftotext ${i}txt.pdf $nom$i.txt ; recode utf8..latin1 $nom$i.txt ; }
{ echo "$domv$2" | grep '^1.*a14[35][ab]\|a75\|^1.*a12[0-9]' >/dev/null ; } && { noxpdf=$noxpdf notilt=$_notilt textvariants=1 ${bintiff}image2textonly-pdf m.png ${i}textvariants.pdf $3 $3 95 "debug`pwd`/image2txt$i" ; }
{ echo "$domv$2" | grep 'a75' >/dev/null ; } && { pdftops ${i}textvariants.pdf ; mv ${i}textvariants.ps ${i}txttxt.ps ; }
{ echo "$domv$2" | grep '^1.*a14[15][ab]\|^1.*a12[0-9]' >/dev/null ; } && { noxpdf=$noxpdf notilt=$_notilt nocuneiform=1 ${bintiff}image2textonly-pdf m.png ${i}textonly.pdf $3 0 0 "debug`pwd`/image2txt$i" ; } # on pourrait aussi appeler image2txtonly-pdf ... plus besoin alors de pdf2psnoimage. Mais c'est image2text-pdf qui casse sa sortie .pdf, donc je préfère utiliser son b/res.pdf :-(
{ echo "$domv$2" | grep '^1.*a14[25][ab]\|^1.*a12[0-9]' >/dev/null ; } && { noxpdf=$noxpdf notilt=$_notilt ${bintiff}image2textonly-pdf m.png ${i}txttxt.pdf $3 0 0 "debug`pwd`/image2txt$i" ; } # on pourrait aussi appeler image2txtonly-pdf ... plus besoin alors de pdf2psnoimage. Mais c'est image2text-pdf qui casse sa sortie .pdf, donc je préfère utiliser son b/res.pdf :-(
#{ echo "$domv$2" | grep 'a14[12][ab]\|a75\|^1.*a12[0-9]' >/dev/null ; } && { pdf2psnoimage ${i}txt.pdf ${i}txttxt.ps ; } # on pourrait aussi appeler image2txtonly-pdf ... plus besoin alors de pdf2psnoimage. Mais c'est image2text-pdf qui casse sa sortie .pdf, donc je préfère utiliser son b/res.pdf :-( # ce serait plus rapide (surtoute avec a752) avec une adaptation de la ligne précédente commentée. # ceci est cassé.
{ echo "$2" | grep 'a75' >/dev/null ; } && {
# ATTENTION, incompatible avec *71[0-9] sauf *7, *71 et *710 ...
ps2boundingbox ${i}txttxt.ps 2>${i}.tailles > /dev/null ; cp ${i}.tailles ${i}retourne.tailles ; { echo "$r1" | grep . >/dev/null ; } && { convert ${i}txttxt.ps ${r1/rotate -/rotate } ps:- | ps2boundingbox - 2>${i}retourne.tailles > /dev/null ; } ; }
{ echo "$domv$2" | grep '^1.*a14[45][ab]\|^1.*a12[0-9]' >/dev/null ; } && { textvariantsconcatenes=1 ${bintiff}image2textonly-pdf m.png ${i}textvariantsconcatenes.pdf $3 $3 95 "debug`pwd`/image2txt$i" ; }
{ { echo "$domv$2" | grep '^1.*a12[ab]' >/dev/null ; } || { echo "$domv$2" | grep '^1' | grep -v 'a1[1-9]' >/dev/null ; } ; } && { ${bintiff}image2pdf m.png $i.pdf $3 $3 95 "debug`pwd`/image2txt$i" ; }
{ echo "$domv$2" | grep '^1.*a12[0-9]' >/dev/null ; } && {
# for paramsimage in `echo $2 | sed s:a12:U:g | tr U '\012' | sed 1d | sed 's:[ab].*$::' | grep .` ; do convert $i -quality ${paramsimage##*12} $r1 $optionlevel -resize `echo '100*'${paramsimage%12*}/$3 | bc -lq`% jpeg:- | convert jpeg:- -density ${paramsimage%12*}x${paramsimage%12*} pdf:- | pdftk - background ${i}txttxt.pdf output ${i}compressed$paramsimage.pdf ; done ;
for paramsimage in `echo $2 | sed s:a12:U:g | tr U '\012' | sed 1d | sed 's:[ab].*$::' | grep .` ; do
case "${paramsimage##*12}a" in
1??*a)
${bintiff}image2compressed-pdf m.png ${i}compressed$paramsimage.pdf $3 ${paramsimage%12*} ${paramsimage##*121} "debug`pwd`/image2txt$i"
;;
*)
${bintiff}image2pdf m.png ${i}compressed$paramsimage.pdf $3 ${paramsimage%12*} ${paramsimage##*12} "debug`pwd`/image2txt$i"
;;
esac
done ; # pwd: pour ne pas relancer la reconnaissance de caractere a chaque coup.
# attention, m.png pourrait etre tourné !! # pourquoi pas ceci?: for paramsimage in `echo $2 | sed s:a12:U:g | tr U '\012' | sed 1d | sed 's:[ab].*$::' | grep .` ; do convert -density ${paramsimage%12*}x${paramsimage%12*} $i -quality ${paramsimage##*12} $r1 $optionlevel jpeg:- | convert jpeg:- -density ${paramsimage%12*}x${paramsimage%12*} pdf:- | pdftk - background ${i}txt.pdf output ${i}compressed$paramsimage.pdf ; echo 'todo utiliser bin/pdf2psnoimage' ; done ;
}
test ${debug/debug*/debug} = debug || rm -rf `pwd`/image2txt$i
done
ls ${1}*.tailles > /dev/null && { maxx=`cut -d' ' -f 5 $1*.tailles | sort -nr | head -n 1 | sed 's:$:+'$enplus'*2*2.845:' | bc -q` ; maxy=`cut -d' ' -f 6 $1*.tailles | sort -nr | head -n 1` ; }
echo $maxx > maxx
echo $maxy > maxy
{ echo "$domv$2" | grep '^1.*a14[ab]' >/dev/null ; } && { listeenvois="$listeenvois `for i in $listefichiers; do echo $nom${i}.txt ; done`" ; }
{ echo "$domv$2" | grep '^1.*a11[ab]' >/dev/null ; } && { pdftk `for i in $listefichiers; do test -e ${i}.tailles && { cat $i.tailles | sed -e 's:.*original_size ::' -e 's: :x:' -e 's:$:'${i}txt.pdf: | DISPLAY= xargs acroread -toPostScript -size ; { cut -d' ' -f 2 $i.tailles | sed 's:$:+2.845*'$enplus: | bc -q ; cut -d' ' -f 3 $i.tailles ; echo $maxx $maxy ; } | tr ' ' '\012' | xargs newcentrexcentreysizexsizey4acroreadtopostscript ${i}txt.ps ; epstopdf ${i}txt.ps ; } ; echo ${i}txt.pdf ; done` cat output ${nom}txt.pdf && listeenvois="$listeenvois ${nom}txt.pdf" ; }
{ echo "$domv$2" | grep '^1.*a12[0-9]' >/dev/null ; } && { for paramsimage in `echo $2 | sed s:a12:U:g | tr U '\012' | sed 1d | sed 's:[ab].*$::' | grep .` ; do pdftk `for i in $listefichiers; do test -e ${i}.tailles && { cat $i.tailles | sed -e 's:.*original_size ::' -e 's: :x:' -e 's:$:'${i}compressed$paramsimage.pdf: | DISPLAY= xargs acroread -toPostScript -size ; { cut -d' ' -f 2 $i.tailles | sed 's:$:+2.845*'$enplus: | bc -q ; cut -d' ' -f 3 $i.tailles ; echo $maxx $maxy ; } | tr ' ' '\012' | xargs newcentrexcentreysizexsizey4acroreadtopostscript ${i}compressed$paramsimage.ps ; epstopdf ${i}compressed$paramsimage.ps ; } ; echo ${i}compressed$paramsimage.pdf ; done` cat output ${nom}compressed$paramsimage.pdf && listeenvois="$listeenvois ${nom}compressed$paramsimage.pdf" ; done ; }
echo -n '_' ; { { echo "$domv$2" | grep '^1.*a12[ab]' >/dev/null ; } || { echo "$domv$2" | grep -v '^0\|a1[1-9]' >/dev/null ; } ; } && { pdftk `for i in $listefichiers; do test -e ${i}.tailles && { cat $i.tailles | sed -e 's:.*original_size ::' -e 's: :x:' -e 's:$:'${i}.pdf: | DISPLAY= xargs acroread -toPostScript -size ; { cut -d' ' -f 2 $i.tailles | sed 's:$:+2.845*'$enplus: | bc -q ; cut -d' ' -f 3 $i.tailles ; echo $maxx $maxy ; } | tr ' ' '\012' | xargs newcentrexcentreysizexsizey4acroreadtopostscript ${i}.ps ; epstopdf ${i}.ps ; } ; echo $i.pdf ; done` cat output $nom.pdf && listeenvois="$listeenvois $nom.pdf" ; }
echo -n '_' ; { echo "$domv$2" | grep '^1.*a14[15][ab]' >/dev/null ; } && { pdftk `for i in $listefichiers; do test -e ${i}.tailles && { cat $i.tailles | sed -e 's:.*original_size ::' -e 's: :x:' -e 's:$:'${i}textonly.pdf: | DISPLAY= xargs acroread -toPostScript -size ; { cut -d' ' -f 2 $i.tailles | sed 's:$:+2.845*'$enplus: | bc -q ; cut -d' ' -f 3 $i.tailles ; echo $maxx $maxy ; } | tr ' ' '\012' | xargs newcentrexcentreysizexsizey4acroreadtopostscript ${i}textonly.ps ; epstopdf ${i}textonly.ps ; } ; echo ${i}textonly.pdf ; done` cat output ${nom}textonly.pdf && listeenvois="$listeenvois ${nom}textonly.pdf" ; }
echo -n '_' ; { echo "$domv$2" | grep '^1.*a14[25][ab]' >/dev/null ; } && { pdftk `for i in $listefichiers; do test -e ${i}.tailles && { cat $i.tailles | sed -e 's:.*original_size ::' -e 's: :x:' -e 's:$:'${i}txttxt.pdf: | DISPLAY= xargs acroread -toPostScript -size ; { cut -d' ' -f 2 $i.tailles | sed 's:$:+2.845*'$enplus: | bc -q ; cut -d' ' -f 3 $i.tailles ; echo $maxx $maxy ; } | tr ' ' '\012' | xargs newcentrexcentreysizexsizey4acroreadtopostscript ${i}txttxt.ps ; epstopdf ${i}txttxt.ps ; } ; echo ${i}txttxt.pdf ; done` cat output ${nom}txttxt.pdf && listeenvois="$listeenvois ${nom}txttxt.pdf" ; }
echo -n '_' ; { echo "$domv$2" | grep '^1.*a14[35][ab]' >/dev/null ; } && { pdftk `for i in $listefichiers; do test -e ${i}.tailles && { cat $i.tailles | sed -e 's:.*original_size ::' -e 's: :x:' -e 's:$:'${i}textvariants.pdf: | DISPLAY= xargs acroread -toPostScript -size ; { cut -d' ' -f 2 $i.tailles | sed 's:$:+2.845*'$enplus: | bc -q ; cut -d' ' -f 3 $i.tailles ; echo $maxx $maxy ; } | tr ' ' '\012' | xargs newcentrexcentreysizexsizey4acroreadtopostscript ${i}textvariants.ps ; epstopdf ${i}textvariants.ps ; } ; echo ${i}textvariants.pdf ; done` cat output ${nom}textvariants.pdf && listeenvois="$listeenvois ${nom}textvariants.pdf" ; }
echo -n '_' ; { echo "$domv$2" | grep '^1.*a14[45][ab]' >/dev/null ; } && { pdftk `for i in $listefichiers; do test -e ${i}.tailles && { cat $i.tailles | sed -e 's:.*original_size ::' -e 's: :x:' -e 's:$:'${i}textvariantsconcatenes.pdf: | DISPLAY= xargs acroread -toPostScript -size ; { cut -d' ' -f 2 $i.tailles | sed 's:$:+2.845*'$enplus: | bc -q ; cut -d' ' -f 3 $i.tailles ; echo $maxx $maxy ; } | tr ' ' '\012' | xargs newcentrexcentreysizexsizey4acroreadtopostscript ${i}textvariantsconcatenes.ps ; epstopdf ${i}textvariantsconcatenes.ps ; } ; echo ${i}textvariantsconcatenes.pdf ; done` cat output ${nom}textvariantsconcatenes.pdf && listeenvois="$listeenvois ${nom}textvariantsconcatenes.pdf" ; }
}
echo "$domv" | grep 0 >/dev/null && {
mkdir scanne
maxx=`cat $1*[^e].tailles | cut -d' ' -f 5 | sort -nr | head -n 1 | sed 's:$:+'$enplus'*2*2.845:' | bc -q` ; maxy=`cat $1*.tailles | cut -d' ' -f 6 | sort -nr | head -n 1` ;
mv $nom* $1* image2txt$1* decoupe scanne
mv scanne/decoupe/image2txt$1* . # pour cacher la reconnaissance de caractère sur les versions découpées.
iout=1
for i in $listefichiers ; do
cat scanne/${i}.tailles ; echo
echo "`cut -d' ' -f 2,5,8 scanne/${i}.tailles | sed -e 's:\(.*\) \(.*\) \(.*\):define max (a,b) { return (a+b)/2+sqrt((b-a)^2)/2; };max(0,'"$maxxfin"'-(\2))*(2*(\1)-\3);\1:' | bc -q | tr '\012' A`"
case `cut -d' ' -f 2,5,8 scanne/${i}.tailles | sed -e 's:\(.*\) \(.*\) \(.*\):define max (a,b) { return (a+b)/2+sqrt((b-a)^2)/2; };max(0,'"$maxxfin"'-(\2))*(2*(\1)-\3);\1:' | bc -q | tr '\012' A` in
*A-*) # page sans caractère, coupée en part égales
cut -d' ' -f 1-9 scanne/${i}.tailles | sed -e 's:\(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\):"\1 ";\8/2;\3;"\4 ";\8;\6;"\7 ";\8;\9:' | bc -lq | tr '\012' ' ' > b
mv b scanne/${i}.tailles
echo A-
;;
-*A*) # trop étroit, plutot à gauche
cut -d' ' -f 1-9 scanne/${i}.tailles | sed -e 's:\(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\):"\1 ";\2+\5/2+2.845*'$enplus';\3;"\4 ";\8;\6;"\7 ";\8;\9:' | bc -lq | tr '\012' ' ' > b
mv b scanne/${i}.tailles
echo A
;;
[.1-9]*A*) # trop étroit, plutot à droite
cut -d' ' -f 1-9 scanne/${i}.tailles | sed -e 's:\(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\):"\1 ";\2-\5/2-2.845*'$enplus';\3;"\4 ";\8;\6;"\7 ";\8;\9:' | bc -lq | tr '\012' ' ' > b
mv b scanne/${i}.tailles
echo A+
;;
esac
cat scanne/${i}.tailles ; echo
case `cut -d' ' -f 3,6,9 scanne/${i}.tailles | sed -e 's:\(.*\) \(.*\) \(.*\):define max (a,b) { return (a+b)/2+sqrt((b-a)^2)/2; };max(0,'"$maxyfin"'-(\2))*(2*(\1)-\3);\1:' | bc -q | tr '\012' A` in
*A-*) # page sans caractère, coupée en part égales
cut -d' ' -f 1-9 scanne/${i}.tailles | sed -e 's:\(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\):"\1 ";\2;\9/2;"\4 ";\5;\9;"\7 ";\8;\9:' | bc -lq | tr '\012' ' ' > b
mv b scanne/${i}.tailles
;;
-*A*) # trop étroit, plutot à gauche
cut -d' ' -f 1-9 scanne/${i}.tailles | sed -e 's:\(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\):"\1 ";\2;\3+\6/2+2.845*'$enplus';"\4 ";\5;\9;"\7 ";\8;\9:' | bc -lq | tr '\012' ' ' > b
mv b scanne/${i}.tailles
;;
[.1-9]*A*) # trop étroit, plutot à droite
cut -d' ' -f 1-9 scanne/${i}.tailles | sed -e 's:\(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\):"\1 ";\2;\3-\6/2-2.845*'$enplus';"\4 ";\5;\9;"\7 ";\8;\9:' | bc -lq | tr '\012' ' ' > b
mv b scanne/${i}.tailles
;;
esac
cat scanne/${i}.tailles ; echo
done
# une page découpée ne peut pas faire moins de $maxx/2 de large.
# TODO modifier ceci pour couper directement dans l'image, avec newcentrexcentreysizexsizey4pnm scanne/$i $3 > $1${iout}.pnm
r1="$rotatepaysagepair"; r2="$rotatepaysage";
echo "$2" | grep 'a752[ab]' >/dev/null && for i in $listefichiers ; do r0="$r1"; r1="$r2"; r2="$r0"; convert scanne/$i -density $3x$3 $r1 eps2:scanne/${i}.eps ; for signe in signe- signe+ ; do { cut -d' ' -f 2,8 scanne/${i}.tailles | sed 's:\(.*\) \(.*\):define max (a,b) { return (a+b)/2+sqrt((b-a)^2)/2; };-max('$maxx'/4-\2,-max('$maxx'/4,\1/2+(1'${signe#signe}'1)*\2/4+2.845*'$enplus')):' | bc -q ; cut -d' ' -f 9 scanne/${i}.tailles | sed 's:$:/2:' | bc -q ; cut -d' ' -f 2,8 scanne/${i}.tailles | sed 's:\(.*\) \(.*\):define max (a,b) { return (a+b)/2+sqrt((b-a)^2)/2; };max('$maxx'/2,-(0'${signe#signe}'1)*\1+(1'${signe#signe}'1)*\2/2+2.845*'$enplus'):' | bc -q ; cut -d' ' -f 9 scanne/${i}.tailles ; } | tr ' ' '\012' | xargs newcentrexcentreysizexsizey4convertpnm2eps scanne/${i}.eps ; convert -density $3x$3 scanne/${i}.eps ${1}${iout}.pnm ; iout=`echo $iout + 1 | bc -q` ; done ; done
# todo propager ci-dessous que 'une page découpée ne peut pas faire moins de $maxx/2 de large.'
r1="$rotatepaysagepair"; r2="$rotatepaysage";
echo "$2" | grep 'a753[ab]' >/dev/null && for i in $listefichiers ; do r0="$r1"; r1="$r2"; r2="$r0"; convert scanne/$i -density $3x$3 $r1 eps2:scanne/${i}.eps ; for signe in signe- signe+ ; do { cut -d' ' -f 8 scanne/${i}.tailles | sed 's:$:/2:' | bc -q ; cut -d' ' -f 3,9 scanne/${i}.tailles | sed 's:\(.*\) \(.*\):\1/2+(1'${signe#signe}'1)*\2/4:' | bc -q ; cut -d' ' -f 8 scanne/${i}.tailles ; cut -d' ' -f 3,9 scanne/${i}.tailles | sed 's:\(.*\) \(.*\):-(0'${signe#signe}'1)*\1+(1'${signe#signe}'1)*\2/2:' | bc -q ; } | tr ' ' '\012' | xargs newcentrexcentreysizexsizey4convertpnm2eps scanne/${i}.eps ; convert -density $3x$3 scanne/${i}.eps ${1}${iout}.pnm ; iout=`echo $iout + 1 | bc -q` ; done ; done
r1="$rotatepaysagepair"; r2="$rotatepaysage";
echo "$2" | grep 'a754[ab]' >/dev/null && for i in $listefichiers ; do r0="$r1"; r1="$r2"; r2="$r0"; convert scanne/$i -density $3x$3 $r1 eps2:scanne/${i}.eps ; for signe in -signe- -signe+ +signe- +signe+ ; do { cut -d' ' -f 2,8 scanne/${i}.tailles | sed 's:\(.*\) \(.*\):\1/2+(1'${signe#*signe}'1)*\2/4+2.845*'$enplus':' | bc -q ; cut -d' ' -f 3,9 scanne/${i}.tailles | sed 's:\(.*\) \(.*\):\1/2+(1'${signe%signe*}'1)*\2/4:' | bc -q ; cut -d' ' -f 2,8 scanne/${i}.tailles | sed 's:\(.*\) \(.*\):-(0'${signe#*signe}'1)*\1+(1'${signe#*signe}'1)*\2/2+2.845*'$enplus':' | bc -q ; cut -d' ' -f 3,9 scanne/${i}.tailles | sed 's:\(.*\) \(.*\):-(0'${signe%signe*}'1)*\1+(1'${signe%signe*}'1)*\2/2:' | bc -q ; } | tr ' ' '\012' | xargs newcentrexcentreysizexsizey4convertpnm2eps scanne/${i}.eps ; convert -density $3x$3 scanne/${i}.eps ${1}${iout}.pnm ; iout=`echo $iout + 1 | bc -q` ; done ; done
r1="$rotatepaysagepair"; r2="$rotatepaysage";
echo "$2" | grep 'a755[ab]' >/dev/null && for i in $listefichiers ; do r0="$r1"; r1="$r2"; r2="$r0"; convert scanne/$i -density $3x$3 $r1 eps2:scanne/${i}.eps ; for signe in +signe- -signe- +signe+ -signe+ ; do { cut -d' ' -f 2,8 scanne/${i}.tailles | sed 's:\(.*\) \(.*\):\1/2+(1'${signe#*signe}'1)*\2/4+2.845*'$enplus':' | bc -q ; cut -d' ' -f 3,9 scanne/${i}.tailles | sed 's:\(.*\) \(.*\):\1/2+(1'${signe%signe*}'1)*\2/4:' | bc -q ; cut -d' ' -f 2,8 scanne/${i}.tailles | sed 's:\(.*\) \(.*\):-(0'${signe#*signe}'1)*\1+(1'${signe#*signe}'1)*\2/2+2.845*'$enplus':' | bc -q ; cut -d' ' -f 3,9 scanne/${i}.tailles | sed 's:\(.*\) \(.*\):-(0'${signe%signe*}'1)*\1+(1'${signe%signe*}'1)*\2/2:' | bc -q ; } | tr ' ' '\012' | xargs newcentrexcentreysizexsizey4convertpnm2eps scanne/${i}.eps ; convert -density $3x$3 scanne/${i}.eps ${1}${iout}.pnm ; iout=`echo $iout + 1 | bc -q` ; done ; done
futur2=`echo $2 | sed -e 's:b:ab:' -e 's:a:aa:g' -e 's:a75[2-5]a:&aUa:g' -e 's:a7\([0-9]*\)a:a7527\1a:g' -e 's:aUa:a75a:g' -e 's:aa:a:g' -e 's:ab:a10b:'`
# le cas a14 et les autres sont geres par post.scan appele ci-dessous
# todo virer les refs a future quand elles n'arriveront plus.
"$0" $1 $futur2 $3
exit 0
}
echo -n '_' ; echo "$2" | grep 'a194[0-8]*[ab]' >/dev/null && {
# on ne tourne pas les images, car c'est du A4. on ne laisse plus la possibilité de quand meme les tourner, pour le cas où la zone de scannage etait rectangulaire dans l'autre sens ; il faut utiliser 753 a la place.
printrotate=''
ls ${1}*retourne.tailles > /dev/null && { maxx=`cat $1*retourne.tailles | cut -d' ' -f 5 | sort -nr | head -n 1 | sed 's:$:+'$enplus'*2*2.845:' | bc -q` ; maxy=`cat $1*retourne.tailles | cut -d' ' -f 6 | sort -nr | head -n 1` ; }
deux=2;
trois=3;
zero=0;
case "$2" in
*a1949[ab]*)
printrotate=" -rotate -90"
maxxx=$maxx ; maxx=$maxy ; maxy=$maxxx
trois=2;
deux=3;
zero=1;
;;
esac
# for i in $listefichiers ; do convert -density $3x$3 $i -density $3x$3 $optionlevel eps2:${i}.eps ; done
for i in $listefichiers ; do convert -density $3x$3 $i -density `expr $3'*'2 | sed 's:.*:&x&:'` -resize 200%x200% -monochrome $printrotate -transparent white $optionlevel eps2:${i}.eps ; done
for i in $listefichiers ; do { cut -d' ' -f $deux,6 ${i}retourne.tailles | sed 's:\(.*\) \(.*\)$:(1-'$zero'*2)*\1+'$zero'*\2:' | bc -q ; cut -d' ' -f $trois ${i}retourne.tailles | sed 's:$:+2.845*'$enplus: | bc -q ; echo $maxx $maxy ; } | tr ' ' '\012' | xargs newcentrexcentreysizexsizey4convertpnm2eps ${i}.eps ; done
# a debeuguer avec \tracingmacros2 pour showmacro montrer les macros.
echo '/documentclass[12pt,a4paper]{article}/nofiles/pagestyle{empty}/usepackage{graphicx}/unitlength1mm/newcommand{/tournepage}{/newpage/hbox{}/vfill/noindent}/def/showimage#1#2#3#4#5{/begin{picture}(0,0)(35.56,41.91)/put(#1){/includegraphics[keepaspectratio=true,clip=true,height=#2/paperheight,width=#3/paperwidth,angle=#4]{#5}}/end{picture}}/begin{document}%http:\\www.cgd.ucar.edu\stats\LATEX\EXAMPLE\example.tex Doug Nychka s LaTeX template (8/13/2004). Modified.' > b.tex
for i in $listefichiers; do echo 'showimage{'${i}.eps'}' ; done | tr '\012' ' ' | sed 's:\([^ ]* [^ ]* [^ ]* [^ ]* [^ ]* [^ ]* [^ ]* [^ ]*\) :\1U :g' | sed '1s:^:U :' | tr 'U' '\012' | sed 's: showimage:showimage1:' | sed 's: showimage:showimage2:' | sed 's: showimage:showimage3:' | sed 's: showimage:showimage4:' | sed 's: showimage:showimage5:' | sed 's: showimage:showimage6:' | sed 's: showimage:showimage7:' | sed 's: showimage:showimage8:' >> b.tex
echo '/end{document}' >> b.tex
}
dvips=dvips ; echo "$2" | grep 'a1945' && dvips=echo
ecart=1; echo "$2" | grep 'a75' && ecart=.97
xe0ms2=`echo '210*(1-'$ecart'/2)' | bc -lq`
ye0ms2=`echo '297*(1-'$ecart'/2)' | bc -lq`
es2=`echo $ecart/2 | bc -lq`
essqrt2=`echo $ecart'/sqrt(2)' | bc -lq`
case "$2" in
*a1949[ab]*)
# dupliqué pour le cas de documents landscape. (option a1949, todo modifier pour que ce soit fait en presence d un seul terme parmi (a7 ou a75[2-5]) et a1949)
echo -n '_' ; echo "$2" | grep 'a1940[ab]' >/dev/null && { cat b.tex | sed -e 's:showimage[1357]:/tournepage/showimage{'$xe0ms2,$ye0ms2'}{'$ecart'}{'$ecart'}{90}:g' -e 's:showimage[2468]:/tournepage/showimage{'$xe0ms2,$ye0ms2'}{'$ecart'}{'$ecart'}{270}:g' | tr '/\134' '\134/' > c.tex ; latex c ; $dvips -P03679rv c.dvi ; }
echo -n '_' ; echo "$2" | grep 'a194[ab]' >/dev/null && { cat b.tex | sed 's:showimage[1-8]:/tournepage/showimage{'$xe0ms2,$ye0ms2'}{'$ecart'}{'$ecart'}{90}:g' | tr '/\134' '\134/' > c.tex ; latex c ; $dvips -P03679raw c.dvi ; }
echo -n '_' ; echo "$2" | grep 'a1941[ab]' >/dev/null && { cat b.tex | sed 's:showimage[1-8]:/tournepage/showimage{'$xe0ms2,$ye0ms2'}{'$ecart'}{'$ecart'}{90}:g' | tr '/\134' '\134/' > c.tex ; latex c ; $dvips -P03679 c.dvi ; }
echo -n '_' ; echo "$2" | grep 'a1942[ab]' >/dev/null && { cat b.tex | sed -e 's:showimage[15]:/tournepage/showimage{'$xe0ms2,$ye0ms2'}{'$essqrt2'}{'$essqrt2'}{90}:g' -e 's:showimage[26]:/showimage{'$xe0ms2',148.5}{'$essqrt2'}{'$essqrt2'}{90}:g' -e 's:showimage[48]:/tournepage/showimage{'$xe0ms2,$ye0ms2'}{'$essqrt2'}{'$essqrt2'}{270}:g' -e 's:showimage[37]:/showimage{'$xe0ms2',148.5}{'$essqrt2'}{'$essqrt2'}{270}:g' | tr '/\134' '\134/' > c.tex ; latex c ; $dvips -P03679raw c.dvi ; }
echo -n '_' ; echo "$2" | grep 'a1943[ab]' >/dev/null && { cat b.tex | sed -e 's:showimage3:/tournepage/showimage{'$xe0ms2',148.5}{'$es2'}{'$es2'}{90}:g' -e 's:showimage1:/showimage{'$xe0ms2,$ye0ms2'}{'$es2'}{'$es2'}{90}:g' -e 's:showimage4:/showimage{105,148.5}{'$es2'}{'$es2'}{90}:g' -e 's:showimage2:/showimage{105,'$ye0ms2'}{'$es2'}{'$es2'}{90}:g' -e 's:showimage6:/tournepage/showimage{'$xe0ms2',148.5}{'$es2'}{'$es2'}{270}:g' -e 's:showimage8:/showimage{'$xe0ms2,$ye0ms2'}{'$es2'}{'$es2'}{270}:g' -e 's:showimage5:/showimage{105,148.5}{'$es2'}{'$es2'}{270}:g' -e 's:showimage7:/showimage{105,'$ye0ms2'}{'$es2'}{'$es2'}{270}:g' | tr '/\134' '\134/' > c.tex ; latex c ; $dvips -P03679rv c.dvi ; }
echo -n '_' ; echo "$2" | grep 'a1943[ab]' >/dev/null && { cat b.tex | sed -e 's:showimage2:/tournepage/showimage{'$xe0ms2',148.5}{'$es2'}{'$es2'}{90}:g' -e 's:showimage1:/showimage{'$xe0ms2,$ye0ms2'}{'$es2'}{'$es2'}{90}:g' -e 's:showimage4:/showimage{105,148.5}{'$es2'}{'$es2'}{90}:g' -e 's:showimage3:/showimage{105,'$ye0ms2'}{'$es2'}{'$es2'}{90}:g' -e 's:showimage7:/tournepage/showimage{'$xe0ms2',148.5}{'$es2'}{'$es2'}{270}:g' -e 's:showimage8:/showimage{'$xe0ms2,$ye0ms2'}{'$es2'}{'$es2'}{270}:g' -e 's:showimage5:/showimage{105,148.5}{'$es2'}{'$es2'}{270}:g' -e 's:showimage6:/showimage{105,'$ye0ms2'}{'$es2'}{'$es2'}{270}:g' | tr '/\134' '\134/' > c.tex ; latex c ; $dvips -P03679rv c.dvi ; }
;;
*)
echo -n '_' ; echo "$2" | grep 'a194[ab]' >/dev/null && { cat b.tex | sed 's:showimage[1-8]:/tournepage/showimage{'$xe0ms2,$ye0ms2'}{'$ecart'}{'$ecart'}0:g' | tr '/\134' '\134/' > c.tex ; latex c ; $dvips -P03679raw c.dvi ; }
echo -n '_' ; echo "$2" | grep 'a1940[ab]' >/dev/null && { cat b.tex | sed 's:showimage[1-8]:/tournepage/showimage{'$xe0ms2,$ye0ms2'}{'$ecart'}{'$ecart'}0:g' | tr '/\134' '\134/' > c.tex ; latex c ; $dvips -P03679rv c.dvi ; }
echo -n '_' ; echo "$2" | grep 'a1941[ab]' >/dev/null && { cat b.tex | sed 's:showimage[1-8]:/tournepage/showimage{'$xe0ms2,$ye0ms2'}{'$ecart'}{'$ecart'}0:g' | tr '/\134' '\134/' > c.tex ; latex c ; $dvips -P03679 c.dvi ; }
echo -n '_' ; echo "$2" | grep 'a1942[ab]' >/dev/null && { cat b.tex | sed -e 's:showimage[1357]:/tournepage/showimage{'$xe0ms2,$ye0ms2'}{'$essqrt2'}{'$essqrt2'}{90}:g' -e 's:showimage[2468]:/showimage{'$xe0ms2',148.5}{'$essqrt2'}{'$essqrt2'}{90}:g' | tr '/\134' '\134/' > c.tex ; latex c ; $dvips -P03679rv c.dvi ; }
echo -n '_' ; echo "$2" | grep 'a1943[ab]' >/dev/null && { cat b.tex | sed -e 's:showimage[15]:/tournepage/showimage{'$xe0ms2',148.5}{'$es2'}{'$es2'}0:g' -e 's:showimage[26]:/showimage{'$xe0ms2,$ye0ms2'}{'$es2'}{'$es2'}0:g' -e 's:showimage[37]:/showimage{105,148.5}{'$es2'}{'$es2'}0:g' -e 's:showimage[48]:/showimage{105,'$ye0ms2'}{'$es2'}{'$es2'}0:g' | tr '/\134' '\134/' > c.tex ; latex c ; $dvips -P03679rv c.dvi ; }
echo -n '_' ; echo "$2" | grep 'a1944[ab]' >/dev/null && { cat b.tex | sed -e 's:showimage[15]:/tournepage/showimage{'$xe0ms2',148.5}{'$es2'}{'$es2'}0:g' -e 's:showimage[37]:/showimage{'$xe0ms2,$ye0ms2'}{'$es2'}{'$es2'}0:g' -e 's:showimage[26]:/showimage{105,148.5}{'$es2'}{'$es2'}0:g' -e 's:showimage[48]:/showimage{105,'$ye0ms2'}{'$es2'}{'$es2'}0:g' | tr '/\134' '\134/' > c.tex ; latex c ; $dvips -P03679rv c.dvi ; }
;;
esac
#a2ps étouffe après dvips :-(, et psnup aussi :-( donc je prefere tout faire en latex, ci-dessus.
echo -n '_' ; echo "$2" | grep 'a13[ab]' && { ~/bin/tiff2rtf b.tiff ${nom}.rtf $nbpages $debug && listeenvois="$listeenvois ${nom}.rtf" ; }
echo -n '_' ; echo "$2" | grep 'a193[ab]' >/dev/null && { ~/bin/tiff2csv b.tiff ${nom}.csv $nbpages $debug && listeenvois="$listeenvois ${nom}.csv" ; }
echo -n '_' ; echo "$2" | grep 'a15[ab]' >/dev/null && { ~/bin/tiff2html b.tiff ${nom}html.tgz $nbpages $debug && { file ${nom}html.tgz | grep html && mv ${nom}html.tgz ${nom}.html ; listeenvois="$listeenvois ${nom}.html" ; } || listeenvois="$listeenvois ${nom}html.tgz" ; }
echo -n '_' ; echo "$2" | grep 'a16[ab]' >/dev/null && { ~/bin/tiff2microsoft.html b.tiff ${nom}html.tgz $nbpages $debug && { file ${nom}html.tgz | grep html && mv ${nom}html.tgz ${nom}.html ; listeenvois="$listeenvois ${nom}.html" ; } || listeenvois="$listeenvois ${nom}html.tgz" ; }
echo -n '_' ; echo "$2" | grep 'a17[ab]' >/dev/null && { ~/bin/tiff2netscape.html b.tiff ${nom}html.tgz $nbpages $debug && { file ${nom}html.tgz | grep html && mv ${nom}html.tgz ${nom}.html ; listeenvois="$listeenvois ${nom}.html" ; } || listeenvois="$listeenvois ${nom}html.tgz" ; }
echo -n '_' ; echo "$2" | grep 'a18[ab]' >/dev/null && { ~/bin/tiff2wp b.tiff ${nom}.wp $nbpages $debug && listeenvois="$listeenvois ${nom}.wp" ; }
echo -n '_' ; echo "$2" | grep 'a190[ab]' >/dev/null && { ln b.tiff ${nom}.tiff ; listeenvois="$listeenvois ${nom}.tiff" ; }
echo -n '_' ; echo "$2" | grep 'a191[ab]' >/dev/null && { convert `echo $argconvert | sed -e 's:\([^ ]*\) \([^ ]*\) :\1 \2\x0a:g' -e "s: :$rotatepaysagepair :" -e 's:^:'"$rotatepaysage ": | xargs -r | tr '\012' ' '` -density $3x$3 $optionlevel ${nom}.mng ; listeenvois="$listeenvois ${nom}.mng" ; }
r1="$rotatepaysagepair"; r2="$rotatepaysage";
echo -n '_' ; echo "$2" | grep 'a192[ab]' >/dev/null && { for i in $listefichiers ; do r0="$r1"; r1="$r2"; r2="$r0"; convert -density $3x$3 $i -density $3x$3 $r1 $optionlevel ${nom}${i%.pnm}.jpg ; listeenvois="$listeenvois ${nom}${i%.pnm}.jpg" ; done ; }
email=`grep "^${2%%[ab]*}\>" $HOME/scans/annuaire | tr '\011' U | sed 's:.*U::' | tr '\012' ,`
onusb=""
echo "$2" | grep 'a2[23][ab]' && onusb="ous pouvez detacher votre clef de l imac, les fichiers y sont. V"
echo "$2" | grep 'a10[ab]' && onusb="ous m'avez appele directement avec les arguments .post.scan $@, en utilisant le mot-clef "'*'"10, sur la machine $hostname V$onusb"
echo "$2" | grep 'a24[ab]' && onusb="ous avez un jour pour telecharger vos fichiers sur \\\\$server\\$share\\hidden\\scans\\$1. V$onusb"
echo "$2" | grep 'a25[ab]' && onusb="ous avez dix jour pour telecharger vos fichiers sur \\\\$server\\$share\\hidden\\scans\\$1. V$onusb"
grep GlobalFlags post.scan.log > /dev/null && { onusb="ous aurez le désagrément de subir une panne : la machine `hostname -i` de $sender n'a plus internet, bloquant la reconnaissance de caractères. Donc il vous manque des fichiers. Recommencez plus tard, quand Internet marchera mieux. V$onusb " ; ${bintiff}tiff2pdf m.png debug.pdf 1 debug ; }
{ echo Bonjour $email ; echo v${onusb}oici les fichiers demandes ; echo $listeenvois ; echo ; ls -l $listeenvois ; md5sum $listeenvois $listefichiers ; echo '-- ' ; echo le demon du scanner, avec la commande ; echo "`echo $2 | sed -e 's:b:ab:' -e 's:a:aa:g' -e 's:a75a:aUa:g' -e 's:a752\(7[0-9]*\)a:a\1a:g' -e 's:\(a75[2-4]a\)aUa:\1:g' -e 's:aa:a:g' -e 's:ab:b:' | tr 'ab' '*#'`" ; echo et les macros $hostname:$HOME/bin/.post.scan $1 $3, ; echo delphes.imac@${SSH_CONNECTION%% *}:$HOME/bin/.scan.automatique, et ; echo le fichier Readiris Pro 9/readiris.exe fourni avec ; echo le scanner HP Laserjet 3020 ; date ; } > fichier.log
case "${email}@$2" in
[^@]*a2[12][ab]*)
cat fichier.log | sed 's:voici:vous trouverez dans '`pwd`' :' ; echo smtp=$smtp' nail -v -r '" $sender -s Fichier(s) scanne(s)" $email 2>&1 | { dd bs=1 count=1024; tail -n 10 ; }
cat fichier.log | sed 's:voici:vous trouverez dans '`pwd`' :' | smtp=$smtp nail -v -r $sender -s "Fichier(s) scanne(s)" $email 2>&1 | { dd bs=1 count=1024; tail -n 10 ; }
;;
[^@]*)
{ cat fichier.log | smtp=$smtp nail -v -r $sender `for i in $listeenvois ; do echo -a $i ; done` -s "Fichier(s) scanne(s)" $email 2>&1 || { cat fichier.log | sed 's:voici:L envoi par e-mail ne fonctionne pas avec vos fichiers (trop de pages ? essayez avec *121501274).\n Contactez $myemail.\n Il trouvera vos fichiers dans '$hostname:`pwd`' :' | smtp=$smtp nail -v -r $sender -s "Fichier(s) scanne(s)" $email ; } | { dd bs=1 count=1024; tail -n 10 ; } ; } 2>&1
cat fichier.log ; echo 'smtp='"$smtp nail -v -r $sender `for i in $listeenvois ; do echo -a $i ; done` -s Fichier(s) scanne(s)" $email 2>&1 | { dd bs=1 count=1024; tail -n 10 ; }
;;
*)
cat fichier.log
;;
esac
case "$2" in
*a2[23][ab]*)
echo ATTENTIONSUITUNFICHIERTAR456789024354657897865746
tar cf - $listeenvois fichier.log
;;
*)
;;
esac
case "$2" in
*a24[ab]*)
cp -a . $httpdestdir/$1
sleep 86400
rm -rf $httpdestdir/$1
;;
*)
;;
esac
case "$2" in
*a25[ab]*)
cp -a . $httpdestdir/$1
sleep 864000
rm -rf $httpdestdir/$1
;;
*)
;;
esac
case "$2" in
*a26[ab]*)
;;
*a27[ab]*)
;;
*a21[ab]*)
;;
*a260[ab]*)
sleep 600
for i in [^pf]*
do cat $i | tr '\000-\377' 'e' > b
dd if=b of=$i
rm $i
done
rm b
;;
*)
sleep 600
for i in [^pf]*
do rm $i
done
;;
*)
;;
esac
case "$2" in
*a7527[ab]*)
mkdir decoupe
mv $nom* $1* image2txt$1* scanne efface decoupe
mv decoupe/scanne/* .
;;
*)
;;
esac
} 2>&1 | tee -a $1/post.scan.log > /dev/null ; } 2>/dev/null >/dev/null &
# pour un truc scanne a l'envers : mettre { echo btxt2.pdf output cat ; echo 189e?.pnmtxt.pdf 189e??.pnmtxt.pdf 189e???.pnmtxt.pdf ; } | tr ' ' '\012' | tac | xargs pdftk
# for i in 3001225 3001275 ; do sleep 0 ; { echo bcompressed$i.pdf output cat ; echo 189e?.pnmcompressed$i.pdf 189e??.pnmcompressed$i.pdf 189e???.pnmcompressed$i.pdf ; } | tr ' ' '\012' | tac | xargs pdftk ; done
# for i in `seq 1 4 186`; do pdftops -f $i -l `expr $i + 3` thesemoreauFINE.pdf b.ps ; a422a4marge b.ps > thesemoreauFINE$i.ps ; ps2pdf thesemoreauFINE$i.ps thesemoreauFINE$i.pdf ; done
# for i in `seq 1 4 212`; do pdftops -f $i -l `expr $i + 3` thesefillonFINE.pdf c.ps ; a422a4marge c.ps > thesefillonFINE$i.ps ; ps2pdf thesefillonFINE$i.ps thesefillonFINE$i.pdf ; done
# for i in `seq 1 8 186`; do pdftops -f $i -l `expr $i + 7` thesemoreauFINE.pdf b.ps ; a422a4marge b.ps > thesemoreauFINE$i.ps ; ps2pdf thesemoreauFINE$i.ps thesemoreauFINE$i.pdf ; done
# for i in `seq 1 8 212`; do pdftops -f $i -l `expr $i + 7` thesefillonFINE.pdf c.ps ; a422a4marge c.ps > thesefillonFINE$i.ps ; ps2pdf thesefillonFINE$i.ps thesefillonFINE$i.pdf ; done
usr/local/bin/pdf2psnoimage 0000755 0000000 0000000 00000000400 11244725442 014712 0 ustar root root #! /bin/sh
pdftops ${1:-} - | sed -e 's:a:aA:g' -e 's:b:aB:g' | tr '\012' 'b' | sed -e 's:b%-EOD-b:a3:g' -e 's:b:a1:g' -e 's:a3:b:g' | tr 'b' '\012' | sed -e 's:a1pdfIma1.*:a1:' -e 's:a1:b:g' | tr b '\012' | sed -e 's:aB:b:g' -e 's:aA:a:g' | cat >${2:-&1}
usr/local/bin/ps2boundingbox 0000755 0000000 0000000 00000002715 11263602443 015126 0 ustar root root #! /bin/bash
tmp=`mktemp -d /tmp/.ps2boundingbox.$$.XXXXXXXXXX`/ # il faut un fichier temporaire, car tee -i est sensible au premier SIGPIPE, contrairement à la doc de tee -i.
{
convert ${1:-ps:-} png:$tmp.png ;
# convert info: fait plus répétable que file ...
convert $tmp.png info: | sed s:$tmp'.png PNG \([0-9][0-9]*\)x\([0-9][0-9]*\) .*:width=\1;height=\2;:'
convert -rotate 90 -depth 8 png:$tmp.png gray:- | tr '\376\377\000-\375' '\012\012a' > $tmp.a
{ cat $tmp.a ; echo a ; } | grep -b a | head -n 1 | sed 's/^\([0-9][0-9]*\):.*/firstcolumn=\1;/'
{ tac $tmp.a ; echo a ; } | grep -b a | head -n 1 | sed 's/^\([0-9][0-9]*\):.*/lastcolumn=\1;/'
convert -depth 8 png:$tmp.png gray:- | tr '\376\377\000-\375' '\012\012a' > $tmp.a
{ cat $tmp.a ; echo a ; } | grep -b a | head -n 1 | sed 's/^\([0-9][0-9]*\):.*/firstline=\1;/'
{ tac $tmp.a ; echo a ; } | grep -b a | head -n 1 | sed 's/^\([0-9][0-9]*\):.*/lastline=\1;/'
echo 'lastline=(lastline)/width;
lastcolumn=(lastcolumn)/height;
firstline=(firstline)/width;
firstcolumn=(firstcolumn)/height;
"%%BoundingBox: "
firstcolumn
lastline
width-1-lastcolumn
height-1-firstline
"center "
(width-lastcolumn-1+firstcolumn)/2
(height-firstline-1+lastline)/2
"size "
width-lastcolumn-firstcolumn
height-lastline-firstline
"original_size "
width
height'
} 2> /dev/null | bc -q 2> /dev/null | tr '\012' ' ' | { tee -i >(sed -e 's:.*center:center:' -e 's:$:\n:' >&2) >(sed 's:center.*::') > /dev/null ; } | cat ; echo
rm -rf $tmp
usr/local/bin/newcentrexcentreysizexsizey4convertpnm2eps 0000755 0000000 0000000 00000001460 11244725522 023077 0 ustar root root #! /bin/bash
echo "$0 $@" >&2
{ echo -n 'Warning, '$0' modifying the boundingbox of '$1', it was ' ; grep -a '^%%HiResBoundingBox' $1 ; } >&2
minx=`echo $2-$4/2 | bc -lq`
miny=`echo $3-$5/2 | bc -lq`
maxx=`echo $2+$4/2 | bc -lq`
maxy=`echo $3+$5/2 | bc -lq`
maxxp1=`echo $2+$4/2+.9999999999 | bc -lq`
maxyp1=`echo $3+$5/2+.9999999999 | bc -lq`
{
echo '/^%%BoundingBox/s/.*/%%BoundingBox:' ${minx%.*} ${miny%.*} ${maxxp1%.*} ${maxyp1%.*}/
echo '/^%%HiResBoundingBox/s/.*/%%HiResBoundingBox:' $minx $miny $maxx $maxy/
echo '/^%%PageBoundingBox/s/.*/%%PageBoundingBox:' ${minx%.*} ${miny%.*} ${maxxp1%.*} ${maxyp1%.*}/
echo '/^%%BoundingBox/s/.*/%%BoundingBox:' ${minx%.*} ${miny%.*} ${maxxp1%.*} ${maxyp1%.*}/
echo '/^%%HiResBoundingBox/s/.*/%%HiResBoundingBox:' $minx $miny $maxx $maxy/
echo wq
} | ed $1 > /dev/null
usr/local/bin/newcentrexcentreysizexsizey4acroreadtopostscript 0000755 0000000 0000000 00000000743 11263115505 024366 0 ustar root root #! /bin/bash
echo "$0 $@" >&2
minx=`echo $2-$4/2 | bc -lq`
miny=`echo $3-$5/2 | bc -lq`
maxx=`echo $2+$4/2 | bc -lq`
maxy=`echo $3+$5/2 | bc -lq`
maxxp1=`echo $2+$4/2+.9999999999 | bc -lq`
maxyp1=`echo $3+$5/2+.9999999999 | bc -lq`
{
echo '/^%%BoundingBox/s/.*/%%BoundingBox:' ${minx%.*} ${miny%.*} ${maxxp1%.*} ${maxyp1%.*}/
echo '/^%%HiResBoundingBox/s/.*/%%HiResBoundingBox:' $minx $miny $maxx $maxy/
echo '/^<<.PageSize .* >> setpagedevice$/s/^/%/'
echo wq
} | ed $1 > /dev/null