Dokumente digitalisieren¶
Hinweis:
Dieses Projekt kann Fehler enthalten und daher Schäden verursachen, das Ausprobieren geschieht daher in Eigenverantwortung. Backups von wichtigen Dateien ist wie immer vor dem Experimentieren angeraten. Kritik und Verbesserung sind erwünscht.
1. DjVu
Wie speichert man gescannte Dokumente ab? Da sich Schriftzeichen oft wiederholen macht es keinen Sinn die Dateien als PDF also JPG abzuspeichern, da es dafür ein besseres Format gibt: DjVu. Dieses erkennt sich wiederholende Muster und sorgt somit für die optimale Komprimierung/Geschwindigkeit. Auch Farbbilder werden berücksichtigt, sowie die Erstellung einer durchsuchbaren Textebene.
Benötigte Pakete:
1 | sudo apt-get install djvulibre-bin didjvu pdf2djvu djview tesseract-ocr tesseract-ocr-deu ocrodjvu pdftk pdfsam pdfshuffler |
Benötigte Software:
Windows Betrachter: DjView, SumatraPDF
optional: DjVu-Solo 3.1 mit wine
Scripte unten in /home/nutzer/bin Scripte.zip ⮷
Um auf eigene Scripte/Programme/Verknüpfungen im Ordner ~/bin, dem Heimatverzeichnis, global per Terminal zugreifen zu können:
1 2 3 | mkdir -p "$HOME/bin" echo 'PATH="$HOME/bin:$PATH"' >> "$HOME/.bashrc" exec bash |
'
Das Script "djvt": Öffnet ein Optionsmenü drücke Taste:
zum Abbrechen und Verlassen des Scripts
Heftet alle DjVu's im Verzeichnis zu einer Datei.
"djvt scan": scannt die Dokumente ein bis zum Abbruch (strg+umsch+c). "djvt" verarbeitet anschließend die Bilder zu einem sw-Dokument welches mit dem bereits im Verzeichnis liegenden Dokument zusammengeheftet wird.
"djvt daspdf.pdf" konvertiert das Pdf in ein bitonales DjVu.
"djvt in.pdf x 2" wandelt in Farbe im Modus tsai. "djvt in.pdf gray" wandelt in Grau im Standardmodus. x ist Platzhalter für Variable $2.
Eine einfache pdf2djvu Konversation, am besten geeignet für Dokumente mit Bildern die detailreich bleiben sollen.
Das Gleiche, aber in etwas besserer Qualität/Dateigröße. Benötigte Software: DjVuDigital.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | echo " ---------------------------------------------------------" echo "1. Quit" echo "2. djvt zusammen.djvu <-*.djvu" echo "3. djvt scan ->neu_alt.djvu (neue Seite zuerst)" echo "4. djvt in.pdf ->bitonal" echo "5. djvt in.pdf x-gray - 1'bernsen' 2'tsai' 3'white-rohrer' 4'abutaleb' 5'shading-subtraction' 6'otsu' 7'djvu' 8'sauvola' 0'niblack' (nichts eingeben für jpeg und -m default)" echo "6. djvt in.pdf -> in.djvu farbe" echo "7. djvt in.pdf -> in.djvu farbe" echo " ---------------------------------------------------------" options=("Quit" "collate" "scan2djvuText" "pdfText2djvuText" "pdfText2didText" "pdf2djvu" "djvudigital") select opt in "${options[@]}" do echo "Opt: $opt, Reply: $REPLY" case $opt in "Quit") break ;; "collate") djvm -c zusammen.djvu *.djvu exit ;; "scan2djvuText") if [[ $1 = scan ]] then mkdir ./tmp; cd ./tmp echo "(neuestes Dokument beginnen, erst abbrechen wenn Datei gespeichert. Gescannte seite umgedreht zurücklegen)( read -p "Press Enter"; -mode gray (epson))" echo "Strg+Caps+C zum abbrechen" for i in {001..100}; do scanimage --mode Lineart --resolution 300 -x 210 -y 297 > $i.pbm; echo $i; done else #read -p "scannen fertig? Dann Enter für tesseract" a="$(ls *.djvu)"; cd ./tmp echo "tesseract" for i in ???.pbm; do tesseract $i ${i%.pbm} -l deu hocr; echo $i; done echo "cjb2" for i in ???.pbm; do cjb2 -lossy $i ${i%pbm}djvu; echo $i; done echo "cjb2<hocr" for i in ???.hocr; do hocr2djvused < $i | djvused -s ${i%hocr}djvu; echo $i; done echo "fasse zusammen" djvm -c djvtex.djvu ???.djvu echo " djvm - c coll.djvu neu.djvu alt.djvu " djvm -c ../neu_"$a" djvtex.djvu ../"$a" fi exit ;; "pdfText2djvuText") echo "pdf2djvu->tex.djvu" echo "${1%.pdf}" mkdir ./"${1%.pdf}"; cd ./"${1%.pdf}" pdf2djvu "../$1" -o tex.djvu echo "extrahiere Text" djvused tex.djvu -e 'output-txt' > Text.dsed echo "bursting pdf" pdftk "../$1" burst output p%04d.pdf for i in p*.pdf; do convert -density 300 -threshold 80% $i ${i%pdf}pbm; echo "$i in pbm"; done for i in p????.pbm; do cjb2 -lossy $i ${i%pbm}djvu; echo "$i in djvu"; done echo "fasse zusammen" djvm -c bitonal.djvu p????.djvu echo "injeziere Text" djvused bitonal.djvu -f Text.dsed -s mv bitonal.djvu "../${1%.pdf}".djvu mv tex.djvu "../${1%.pdf}"-pdf2djvu.djvu exit ;; "pdfText2didText") if [[ $3 = '0' ]] then a='niblack'; b='-m' elif [[ $3 = '1' ]] then a='bernsen'; b='-m' elif [[ $3 = '2' ]] then a='tsai'; b='-m' elif [[ $3 = '3' ]] then a='white-rohrer'; b='-m' elif [[ $3 = '4' ]] then a='abutaleb'; b='-m' elif [[ $3 = '5' ]] then a='shading-subtraction'; b='-m' elif [[ $3 = '6' ]] then a='otsu'; b='-m' elif [[ $3 = '7' ]] then a='djvu'; b='-m' elif [[ $3 = '8' ]] then a='sauvola'; b='-m' fi echo " (otsu niblack sauvola für Dokumente) (djvu white-roarer Fotos" echo " pdf in jpg " echo "${1%.pdf}" mkdir ./"${1%.pdf}"; cd ./"${1%.pdf}" if [[ $2 = "gray" ]] then echo "pdf in jpg Grau" gs -sDEVICE=jpeggray -r300 -o p%04d.jpg "../$1" else echo "pdf in jpg Farbe" gs -sDEVICE=jpeg -r300 -o p%04d.jpg "../$1" fi echo " jpg in djvu " did bundle -o did.djvu $b $a --lossy p????.jpg echo " pdf2djvu " pdf2djvu "../$1" -o tex.djvu echo " extrahiere Text " djvused tex.djvu -e 'output-txt' > Text.dsed echo " injeziere Text " echo " Textübertragen geht nur bei einer didjvu mit mehr als einer Seite wegen p0001.djvu.... " cp did.djvu did2.djvu djvused did2.djvu -f Text.dsed -s mv did2.djvu ../"${1%.pdf}"-$a.djvu cp tex.djvu ../"${1%.pdf}"-pdf2djvu.djvu exit ;; "pdf2djvu") pdf2djvu "$1" -o pdf2djvu_"${1%.pdf}".djvu exit ;; "djvudigital") djvudigital --words "$1" djvudigital_"${1%.pdf}".djvu exit ;; *) echo invalid option;; esac done |
in diesem Script wird anstelle von didjvu did aufgerufen, das liegt daran, dass die aktuellste Verision vom Entwickler mit did verknüfpt ist.
2.PDF
Für getippte Dokumente bietet sich PDF an, da es das Standardformat zum Austausch von Dokumenten ist. Aber wie organisiert man PDF Dateien? Grafisch kann an mit pdfsam PDF's zusammenführen, mit pdfshuffler ebenfalls, aber auch noch Seiten untereinander tauschen.
Folgendes Script "pdft" verwendet pdftk, dieses Programm lässt Pdf Dateien im Orginalzustand, dh. es wird nicht wie z.B. mit Ghostscript neu interpretiert.
Abbruch
Heftet alle PDF's im Verzeichnis zusammen.
Spaltet das angegebene PDF in seine Einzelseiten auf.
Wandelt das PDF in jpg Bilder
"pdft dokument.pdf "3-5 7 80-99" speichert diese Seiten in ein neues Dokument.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | echo " ---------------------------------------------------------" echo "1. Quit" echo "2. pdft out.pdf <- *.pdf" echo "3. pdft in.pdf -> p001.pdf ..." echo "4. pdft in.pdf jpg-pbm -> p001.jpg ..." echo '5. pdft in.pdf "2 4-6" _in.pdf' echo " ---------------------------------------------------------" echo " pdftk belässt alle PDF Seiten im Orginalzustand " options=("Quit" "collate" "burst" "pdf2img" "pick") select opt in "${options[@]}" do echo "Opt: $opt, Reply: $REPLY" case $opt in "Quit") break ;; "collate") pdftk *.pdf cat output "$1" exit ;; "burst") echo "${1%.pdf}" mkdir ./"${1%.pdf}"; cd ./"${1%.pdf}" pdftk "../$1" burst output "p%03d.pdf" exit ;; "pdf2img") echo "${1%.pdf}" mkdir ./"${1%.pdf}"; cd ./"${1%.pdf}" pdftk "../$1" burst output "p%04d.pdf" for i in p????.pdf; do convert -density 300 "$i" "${i%pdf}"$2""; echo " $i in img"; done exit ;; "pick") pdftk "$1" cat $2 output "$2"_"$1".pdf exit ;; *) echo invalid option;; esac done |
'
Das Script "gst" arbeitet mit Ghostscript, welches manchmal auch sporadisch Seiten verunstaltet, deshalb das Ergebnis kontrollieren:
Abbruch
Heftet alle im Verzeichnis liegende PDF zu einer Datei.
Spaltet das angegebene PDF in seine Einzelseiten auf.
"gst dokument.pdf" wandelt das PDF in jpg Bilder. "gst dokument.pdf jpegray" Selbiges in Graustufen.
Wandelt alle Bilder im Ordner in PDF's um.
Interpretiert die PDF Datei neu, in geringer Auflösung. Die Datei wird dadurch meist kleiner.
Das Gleiche, nur diesmal wird die Ausgabe Graustufen.
Nimmt einen Seitenbereich und speichert diesen in eine neue Datei, z.B. Seite 1-3.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | echo " ---------------------------------------------------------" echo "1. Quit" echo "2. gst out.pdf <-*.pdf" echo "3. gst in.pdf ->p???.pdf " echo "4. gst in.pdf (jpeggray-pbm(rubbish)-tiffscaled(rubbish)-jpeg(default))->p????.jpg " echo "5. gst out.pdf <-*.jpg" echo "6. gst in.pdf (ebook-printer-prepress-default) screen(default) -> compressed-...pdf" echo "7. gst in.pdf (ebook-printer-prepress-default) screen(default) -> compressed-...pdf" echo "8. gst in.pdf 1 3 p1-3->1-3_in.pdf" echo " ---------------------------------------------------------" options=("Quit" "collate" "burst" "pdf2img" "jpg2pdf" "pdfcompress" "pdfcompressgrey" "pick") select opt in "${options[@]}" do echo "Opt: $opt, Reply: $REPLY" case $opt in "Quit") break ;; "collate") gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile="$1" *.pdf exit ;; "burst") echo "${1%.pdf}" mkdir ./"${1%.pdf}"; cd ./"${1%.pdf}" ournum=`gs -q -dNODISPLAY -c "("../$1") (r) file runpdfbegin pdfpagecount = quit" 2>/dev/null` echo "Processing $ournum pages" counter=1 while [ $counter -le $ournum ] ; do newname="$(printf "p%04d" $counter).pdf" counterplus=$((counter+1)) # make the individual pdf page yes | gs -dBATCH -sOutputFile="$newname" -dFirstPage=$counter -dLastPage=$counter -sDEVICE=pdfwrite "../$1" >& /dev/null counter=$counterplus done exit ;; "pdf2img") echo "${1%.pdf}" mkdir ./"${1%.pdf}"; cd ./"${1%.pdf}" if [[ $2 = "pbm" ]] then gs -sDEVICE=$2 -r300 -o p%04d.pbm "../$1" elif [[ $2 = "tiffscaled" ]] then gs -sDEVICE=$2 -r300 -o p%04d.tif "../$1" elif [[ $2 = "jpeggray" ]] then gs -sDEVICE=$2 -r300 -o p%04d.jpg "../$1" else gs -sDEVICE=jpeg -r300 -o p%04d.jpg "../$1" fi exit ;; "jpg2pdf") for i in *.jpg; do echo '('$i') viewJPEG showpage'; done | gs -sDEVICE=pdfwrite -o "$1" viewjpeg.ps -c "-" exit ;; "pdfcompress") if [[ $2 = "" ]] then gs -sDEVICE=pdfwrite -sPAPERSIZE=a4 -dFIXEDMEDIA -dPDFFitPage -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile="compress-$1" "$1" echo "compressed" else gs -sDEVICE=pdfwrite -sPAPERSIZE=a4 -dFIXEDMEDIA -dPDFFitPage -dCompatibilityLevel=1.4 -dPDFSETTINGS=/$2 -dNOPAUSE -dQUIET -dBATCH -sOutputFile="compress-$1" "$1" echo "compressed" fi exit ;; "pdfcompressgrey") if [[ $2 = "" ]] then gs -sDEVICE=pdfwrite -sPAPERSIZE=a4 -dFIXEDMEDIA -dPDFFitPage -dProcessColorModel=/DeviceGray -dColorConversionStrategy=/Gray -dPDFUseOldCMS=false -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile="compress-$1" "$1" echo "compressed" else gs -sDEVICE=pdfwrite -sPAPERSIZE=a4 -dFIXEDMEDIA -dPDFFitPage -dProcessColorModel=/DeviceGray -dColorConversionStrategy=/Gray -dPDFUseOldCMS=false -dCompatibilityLevel=1.4 -dPDFSETTINGS=/$2 -dNOPAUSE -dQUIET -dBATCH -sOutputFile="compress-$1" "$1" echo "compressed" fi exit ;; "pick") gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dFirstPage=$2 -dLastPage=$3 -sOutputFile="$2-$3_$1" "$1" exit ;; *) echo invalid option;; esac done |
'
DjVu Seiten auftrennen tauschen etc:
pdf2djvu, minidjvu oder DjVu-Solo z.B. erstellen sogenannte verteilte Informationen, d.h. im Dokument werden z.B. *.iff *.djbz Dateien angelegt die, wollte man eine Seite vom Dokument trennen, mitgenommen werden müssten. Folgende Möglichkeiten berücksichtigen dies:
––––→ bundle index
1 2 3 4 | djvmcvt -i in.djvu ./ index.djvu djvmcvt -b index.djvu bundled.djvu # DjVus zusammenheften: djvm -c ebook.djvu p????.djvu |
––––→ extract pages
mit DjView oder
1 2 | djvused "in.djvu" -e 'select 5; save-page-with p05.djvu' # (extrahiert Seiten mit den nötigen verteilten Informationen *.iff *.djbz, cjb2 hat keine solche Informationen) |
––––→ shuffle pages
DjVu Solo oder indirekt abspeichern und die Dateinamen untereinander tauschen. Seiten umkehren:
1 2 | rename.ul "p" "c" p????_0001.djvu j=9; for i in c????_0001.djvu; do mv $i $(printf "p%04d_0001" $j).djvu; ((j--)); done |
'
PDF Tipps:
Bei Pdfs hat man oft das Problem, dass die Seitengrößen unterschiedlich sind, man kann dann mit Ghostview bzw. mit dem gst-Script die Datei neu interpretieren.
unterschiedliche Dokumente mit Drehen von Seiten:
1 2 | pdftk A=Dokument.pdf B=doc2.pdf cat B1-2W A1 B3-4 A2-4 B5-8 output gemischt.pdf # (W=270° S=180° E=90°) |
Nur Bilder einer PDF Datei extrahieren:
1 | pdfimages in.pdf p |