construct object
Home sweet home
Nav
hide
S1
S2
S3
Name: convertScanMultiplePNGToPDF
Typ: bash
benötigt: potrace, convert / imageMagick und ein paar Graphikprogramme
Ein Script, um png-Dateien, die beim Scannen entstehen in pdf Dateien umzuwandenln.

Nachteil: nur schwarz weiß
Vorteil: hohe Qualität, sehr geringe Dateigröße

Die benötigten Programme dürften in diversen Linux-Distributionen verfügbar sein, bei potrace bin ich mir nicht ganz sicher.

Details: Beim Scan von Dokumenten entstehen Pixel-Graphiken, die viele Details enhalten, die man nicht braucht. Auf die Kaffee-Flecken kann man meist verzichten. Handelt es sich um reine schwarz-weiß Dokumente, so ist der Ansatz wie unter
http://mirror.hamakor.org.il/archives/linux-il/07-2004/10831.html
beschrieben recht erfolgreich. Man wandelt die Dateien mittels potrace in eine Vektor-Graphik um. Diese wird dabei geglättet und anschließend wieder in eine Bitmap umgewandelt - nur halt glatter und mit weniger Flecken.

Das folgende Script faßt die beschriebenen Schritte zusammen. – wie immer keinerlei Gewähr.
hide
convertScanMultiplePNGToPDF
#!/bin/bash
tdir=convert_tmp
echo "see http://mirror.hamakor.org.il/archives/linux-il/07-2004/10831.html"
echo "Karsten Roemke, September 2009"
echo "Umwandlung in Vektorgrafik per potrace -> skalierbar, aber ca Faktor 10 größer"
echo "auf potrace homepage noch hinweise - leider gerade keine Zeit ..."
echo "scan sollte mit 600 dpi erfolgt sein nicht mit 300, nicht zu hell, lieber ein paar flecken!"
echo "pngs koennen auch geloescht werden"
echo "mit convert -density 600x600 allPages.pdf original.png"
echo "bekommt man sie wieder - dauert nur :-)"
echo "musste festellen, bei scan von 600 dpi haben die pdfs die "
echo "doppelte Kantenlaenge - offenbar ist 300dpi irgendwo verdrahtet"
echo "noch unklar - nein geloest, denke pgm kennt keine resolution"
echo "spaeter wieder einbauen, pnmtotiff -> erledigt"
 
echo "create  $tdir in actual dir - ctrl c to stop"
 
echo "Am Ende zwischenErgebnisse ($tdir) entfernen? (j) [j/n]"
read tempWeg
 
 
echo "otherwise enter threshold in [0;1], bigger is darker";
echo "original author says 0.5 I take 0.9 for a bad original, higher -> darker?"
echo "thresh: " 
read thresh
 
mkdir ./$tdir || exit
 
echo "create pgms"
for i in *.png  
do 
   echo convert $i $tdir/${i%.png}.pgm
   convert $i $tdir/${i%.png}.pgm
done
 
cd $tdir
 
echo "using potrace -> vector graphics"
for i in *.pgm 
do  
   echo potrace -g $i -o ${i%.pgm}-2.pgm
   potrace -g $i -o ${i%.pgm}-2.pgm
done
 
echo "to pbm via pgmtopbm"
for i in *-2.pgm  
do  
  echo pgmtopbm -threshold -value $thresh $i > ${i%-*}.pbm 
  pgmtopbm -threshold -value $thresh $i > ${i%-*}.pbm 
done
 
echo "generate tiffs with g4 black/white losless compression"
for i in *.pbm 
do  
   #ermittle auflösung
   xrest=$(identify -format "%x" ../${i%.pbm}.png)
   yrest=$(identify -format "%y" ../${i%.pbm}.png)   
   resunit=inch
   #check ob PixelsPerCentimeter / bzw. nur Centimeter in xres enthalten 
   #dann nehme ich x / y als pixel per cm an, sonst als pixel per inch 
   echo $xrest | grep -q -i centimeter 
   if [[ $? == 0 ]] #gefunden
   then
     resunit=centimeter
   fi
   #variablen splitten
   set -- $xrest # xrest auf $1..$n, siehe mein beispiel in splitVarByReadBetterSet
   #hobby-runden / abschneiden, dachte es geht mit printf
   xres=$(echo $1 | cut -d . -f 1)
   set -- $yrest
   yres=$(echo $1 | cut -d . -f 1)
   echo "found in orig image ${i%.pbm} xres $xres and yres $yres with unit  per $resunit"
   echo pnmtotiff -xresolution $xres -yresolution $yres -resolutionunit $resunit -g4 $i > ${i%.pbm}.tiff 
   pnmtotiff -xresolution $xres -yresolution $yres -resolutionunit $resunit -g4 $i > ${i%.pbm}.tiff 
done
echo "concatenate tiffs"
echo tiffcp *.tiff allPages.tiff
tiffcp *.tiff allPages.tiff
 
echo "convert to pdf"
 
echo tiff2pdf -o ../allPages.pdf allPages.tiff
tiff2pdf -o ../allPages.pdf allPages.tiff
 
cd ..
 
if [[ "$tempWeg." != "n." ]]
then
  echo "cleaning up"
  rm -rf $tdir
fi
 
 
 
 
 
 
 
Parsed using GeSHi 1.0.8.6
Download / View Source / Run it   (depends on file type)

Karsten Römke (k Ponkt roemke at gmx in de), Rechtliches, Datenschutz, etc.
Rein private Seite, lediglich eine Spielerei
Last modified: 2010-04-18
Created: 2010-04-18
Reason: –
Home sweet home