KI für Texterkennung gesucht...

Ich benutze Frog und verstehe dein Problem nicht.

Der mittels OCR ausgegebene Text wird in eine Textverarbeitung eingefügt und dort formatiert. Da brauche ich weder KI noch eine russische Texterkennungssoftware.
 
  • Gefällt mir
Reaktionen: madmax2010
Moin, ich sehe es so wie @NJay da gerade bei PDFs das Bild und der Text zwei getrennte Layer sind, kann dir da eine KI wunderbar das Korrekturlesen abnehmen und anschließend wieder als PDF zurückgeben.
 
@gimmix sweet. Das nutzt tesseract, meine alte config funktioniert ootb in der config.py . bye bye alte bash scripts
 
  • Gefällt mir
Reaktionen: gimmix
mischaef schrieb:
ob das wegen Urheberrecht und so hier geht.

Dann kannst Du das eh eigentlich nur lokal machen.

mischaef schrieb:
Foto-Scanner, 300 DPI gescannt. Ja, die Scanns sind vernünftig

In Farbe gescannt und nicht in Graustufen? Oder noch besser S/W.
Abbys FineReader war eigentlich das ultimative Tool damals als wir Tonnen an Akten scannen mussten und die entstehenden PDF auch noch durchsuchbar sein sollten.

Anyway.
Probier mal NAPS2. Da ist meines Wissens Tesseract dahinter.
 
  • Gefällt mir
Reaktionen: AlanK, cartridge_case und Sensei21
Sind für Finereader nicht 600 DPI und S/W empfohlen ?

hab das damals so gemacht, da es mit 300 DPI nicht so toll lief
 
  • Gefällt mir
Reaktionen: BFF und cartridge_case
mischaef schrieb:
da waren einige dicke Fehler in meinem Text drinn
Könnte es einfach am Quellmaterial liegen? Was genau wird denn gescannt? Mit welcher Auflösung?

mischaef schrieb:
Da würde ich wohl mindestens verdoppeln. Es geht hier ja anscheinend um mehrere Bücher. Eventuell auch einfach mal professionelle Hilfe in Anspruch nehmen.
 
Müsst doch die Daten nicht an Dritte geben. Sprich API nutzen für so etwas, was wieder Geld kostet. Zwei Nachteile die hier bei dem Beispiel nicht sein müssen.

Mistral hat gestern eine wirklich sehr gutes LLM für OCR herausgehauen. Das ist um einiges besser als tesseract


https://mistral.ai/news/mistral-ocr-3
 
@madmax2010
Tesseract nimmt aber anscheinend keine PDFs...daher für mich nicht nutzbar.

@gimmix
Wenn ein ganzes Buch als ein einziger Wortwurm ausgegeben wird, ist das nicht mehr zu formatieren. Im Grunde müsste das ganze Buch durchgegangen werden, welcher Satz in einer neuen Zeile beginnt.

@konkretor
Gibt es die nur als API oder auch per Web?
 
Zuletzt bearbeitet:
mischaef schrieb:
Wenn ein ganzes Buch als ein einziger Wortwurm ausgegeben wird, ist das nicht mehr zu formatieren.
Frag doch mal bei Verlagen an, was die so benutzen. Da gibt es Skripte, die .txt oder .docx in ein vorkonfiguriertes InDesign-Layout ausleiten, und andere schöne Sachen.

Autor schickt mit Word97 kaputtformatierten Wortmüll an Verlag -> Wortmüll ins Layout der Zeitschrift XY gegossen.

Dass da anschließend Korrekturgelesen werden muss, ist ja klar.
 
mischaef schrieb:
Tesseract nimmt aber anscheinend keine PDFs...daher für mich nicht nutzbar.
doch, sorry. VErgessen was zu zu sagen
https://github.com/ocrmypdf/OCRmyPDF
ist ein tesseract wrapper der das ganz gut kann.

ansonsten tut es auch, die seiten einzeln in Bilder umzuwandeln, tesseract dagagen laufen zu lassen



und mein altes buch script. hab mal ein paar echos, sanity checks und allgemein debug Kram eingebaut, um die nutzung einfach zu machen

Bash:
#!/usr/bin/env bash

set -euo pipefail

# One script that:
#  1) Sanity-checks required binaries and language data
#  2) OCRs an input PDF into:
#       - a searchable PDF (text layer)  -> output.pdf
#       - a plain text file next to it   -> output.txt
#
# Usage:
#   bash ocr_tess_allinone.sh input.pdf [output.pdf]
#
# Environment overrides:
#   DPI=300            # render DPI for pdftoppm
#   LANGUAGE=eng       # tesseract language
#   PSM=3              # tesseract page segmentation mode
#   DEBUG=0            # set to 1 for shell tracing
#   KEEP_WORKDIR=0     # set to 1 to keep temp files for debugging

usage() { echo "Usage: $0 input.pdf [output.pdf]"; exit 64; }

# ---------------------- args ----------------------
[[ $# -ge 1 ]] || usage
in_pdf="$1"
out_pdf="${2:-${in_pdf%.pdf}.ocr.pdf}"
out_txt="${out_pdf%.pdf}.txt"

[[ -f "$in_pdf" ]] || { echo "ERROR: input not found: $in_pdf" >&2; exit 66; }

DPI="${DPI:-300}"
LANGUAGE="${LANGUAGE:-eng}"
PSM="${PSM:-3}"
DEBUG="${DEBUG:-0}"
KEEP_WORKDIR="${KEEP_WORKDIR:-0}"

[[ "$DEBUG" == "1" ]] && set -x

# ---------------------- helpers ----------------------
ok()   { printf "OK   : %s\n" "$*"; }
info() { printf "INFO : %s\n" "$*"; }
warn() { printf "WARN : %s\n" "$*" >&2; }
err()  { printf "ERROR: %s\n" "$*" >&2; }

have() { command -v "$1" >/dev/null 2>&1; }
binpath() { command -v "$1" 2>/dev/null || true; }

require_bin() {
  local b="$1"
  if have "$b"; then
    ok "binary '$b' found: $(binpath "$b")"
  else
    err "binary '$b' NOT found in PATH"
    return 1
  fi
}

optional_bin() {
  local b="$1"
  if have "$b"; then
    ok "binary '$b' found: $(binpath "$b")"
    return 0
  else
    warn "binary '$b' not found (needed to merge multi-page PDFs)"
    return 1
  fi
}

section() { printf "\n== %s ==\n" "$*"; }

# ---------------------- workdir ----------------------
workdir="$(mktemp -d)"
cleanup() {
  if [[ "$KEEP_WORKDIR" == "1" ]]; then
    info "Keeping workdir: $workdir"
  else
    rm -rf "$workdir"
  fi
}
trap cleanup EXIT

# ---------------------- header ----------------------
section "Configuration"
info "Input : $in_pdf"
info "Output: $out_pdf"
info "Text  : $out_txt"
info "DPI   : $DPI"
info "Lang  : $LANGUAGE"
info "PSM   : $PSM"
info "Work  : $workdir"

# ---------------------- sanity checks ----------------------
section "Sanity checks: binaries"
missing=0
require_bin pdftoppm || missing=1
require_bin tesseract || missing=1
have_pdfunite=1
optional_bin pdfunite || have_pdfunite=0

if [[ "$missing" -eq 1 ]]; then
  err "Missing required binaries. Install Poppler (pdftoppm) and Tesseract."
  exit 69
fi

section "Sanity checks: tesseract language data"
# 1) Does tesseract list the language?
langs="$(tesseract --list-langs 2>/dev/null || true)"
if [[ -z "$langs" ]]; then
  err "Failed to run 'tesseract --list-langs'."
  exit 70
fi

if printf "%s\n" "$langs" | awk 'NR>1{print $0}' | grep -Fxq "$LANGUAGE"; then
  ok "language '$LANGUAGE' is listed by tesseract"
else
  err "language '$LANGUAGE' is NOT listed by tesseract"
  warn "Installed languages:"
  printf "%s\n" "$langs" | sed 's/^/WARN : /' >&2
  warn "If you installed the language pack, you may need to set TESSDATA_PREFIX."
  warn "Try: export TESSDATA_PREFIX=\"$(tesseract --print-tessdata-dir 2>/dev/null || echo /path/to/tessdata)\""
  exit 71
fi

# 2) Best-effort: verify traineddata file is readable (paths differ by distro)
tessdata_dir="$(tesseract --print-tessdata-dir 2>/dev/null || true)"
trained_ok=0
if [[ -n "$tessdata_dir" && -r "$tessdata_dir/${LANGUAGE}.traineddata" ]]; then
  ok "traineddata readable: $tessdata_dir/${LANGUAGE}.traineddata"
  trained_ok=1
else
  for d in \
    "/usr/share/tesseract-ocr/5/tessdata" \
    "/usr/share/tesseract-ocr/4.00/tessdata" \
    "/usr/share/tessdata" \
    "/usr/local/share/tessdata" \
    "/opt/homebrew/share/tessdata" \
    "/usr/share/tesseract/tessdata"
  do
    if [[ -r "$d/${LANGUAGE}.traineddata" ]]; then
      ok "traineddata readable: $d/${LANGUAGE}.traineddata"
      trained_ok=1
      break
    fi
  done
fi

if [[ "$trained_ok" -eq 0 ]]; then
  warn "Could not confirm '${LANGUAGE}.traineddata' in common locations."
  warn "If OCR fails with 'Error opening data file', set TESSDATA_PREFIX to your tessdata directory."
  [[ -n "$tessdata_dir" ]] && warn "tesseract reported tessdata dir: $tessdata_dir"
fi

section "Version info"
tesseract --version | sed 's/^/INFO : /' || true
pdftoppm -v 2>&1 | head -n 2 | sed 's/^/INFO : /' || true

# ---------------------- OCR pipeline ----------------------
section "Step 1: render PDF pages to images (pdftoppm)"
pdftoppm -r "$DPI" -png "$in_pdf" "$workdir/page" >/dev/null
ok "render complete"

section "Step 2: locate rendered images"
mapfile -t pages < <(find "$workdir" -maxdepth 1 -type f -name 'page*.png' | sort -V)
if [[ ${#pages[@]} -eq 0 ]]; then
  err "No page images were produced by pdftoppm."
  err "Try running manually: pdftoppm -r $DPI -png \"$in_pdf\" \"$workdir/page\""
  exit 72
fi
ok "found ${#pages[@]} page image(s)"

section "Step 3: OCR pages (searchable PDF pages + appended text)"
: > "$out_txt"  # truncate/create output text file
out_pages=()
i=0

for img in "${pages[@]}"; do
  (( ++i ))
  base="$workdir/ocr-$(printf '%06d' "$i")"
  info "OCR page $i / ${#pages[@]}: $(basename "$img")"

  # IMPORTANT: do not pass "--" to tesseract (it will treat it as a filename).
  tesseract "$img" "$base" -l "$LANGUAGE" --psm "$PSM" pdf >/dev/null
  out_pages+=( "${base}.pdf" )

  tesseract "$img" "$base" -l "$LANGUAGE" --psm "$PSM" txt >/dev/null
  cat "${base}.txt" >> "$out_txt"
  printf "\n\n\f\n\n" >> "$out_txt"   # page separator
done
ok "OCR complete (PDF pages + TXT)"

section "Step 4: assemble final PDF"
if [[ ${#out_pages[@]} -eq 1 ]]; then
  mv "${out_pages[0]}" "$out_pdf"
  ok "single-page output written: $out_pdf"
else
  if [[ "$have_pdfunite" -ne 1 ]]; then
    err "Multiple pages detected but 'pdfunite' is missing, so merge cannot be done."
    err "Install poppler-utils (or poppler) to get pdfunite, then rerun."
    exit 73
  fi
  pdfunite "${out_pages[@]}" "$out_pdf"
  ok "merged multi-page output written: $out_pdf"
fi

section "Done"
ok "PDF: $out_pdf"
ok "TXT: $out_txt"



noch nicht perfekt, aber tut.
Ergänzung ()

quick test
bash ocr_tess.sh sv600_c_normal.pdf  18:39

== Configuration ==
INFO : Input : sv600_c_normal.pdf
INFO : Output: sv600_c_normal.ocr.pdf
INFO : Text : sv600_c_normal.ocr.txt
INFO : DPI : 300
INFO : Lang : eng
INFO : PSM : 3
INFO : Work : /tmp/tmp.BkfvksJP2o

== Sanity checks: binaries ==
OK : binary 'pdftoppm' found: /usr/bin/pdftoppm
OK : binary 'tesseract' found: /usr/bin/tesseract
OK : binary 'pdfunite' found: /usr/bin/pdfunite

== Sanity checks: tesseract language data ==
OK : language 'eng' is listed by tesseract
OK : traineddata readable: /usr/share/tessdata/eng.traineddata

== Version info ==
INFO : tesseract 5.5.1
INFO : leptonica-1.86.0
INFO : libgif 5.2.2 : libjpeg 8d (libjpeg-turbo 3.1.2) : libpng 1.6.53 : libtiff 4.7.1 : zlib 1.3.1 : libwebp 1.6.0 : libopenjp2 2.5.4
INFO : Found AVX512BW
INFO : Found AVX512F
INFO : Found AVX512VNNI
INFO : Found AVX2
INFO : Found AVX
INFO : Found FMA
INFO : Found SSE4.1
INFO : Found OpenMP 201511
INFO : Found libarchive 3.8.4 zlib/1.3.1 liblzma/5.8.1 bz2lib/1.0.8 liblz4/1.10.0 libzstd/1.5.7 openssl/3.6.0 libb2/bundled libacl/2.3.2 libattr/2.3.2
INFO : Found libcurl/8.17.0 OpenSSL/3.6.0 zlib/1.3.1 brotli/1.1.0 zstd/1.5.7 libidn2/2.3.8 libpsl/0.21.5 libssh2/1.11.1 nghttp2/1.68.0 nghttp3/1.13.1 mit-krb5/1.21.3
INFO : pdftoppm version 25.12.0
INFO : Copyright 2005-2025 The Poppler Developers - http://poppler.freedesktop.org

== Step 1: render PDF pages to images (pdftoppm) ==
OK : render complete

== Step 2: locate rendered images ==
OK : found 1 page image(s)

== Step 3: OCR pages (searchable PDF pages + appended text) ==
INFO : OCR page 1 / 1: page-1.png
Error in boxClipToRectangle: box outside rectangle
Error in pixScanForForeground: invalid box
Error in boxClipToRectangle: box outside rectangle
Error in pixScanForForeground: invalid box
OK : OCR complete (PDF pages + TXT)

== Step 4: assemble final PDF ==
OK : single-page output written: sv600_c_normal.ocr.pdf

== Done ==
OK : PDF: sv600_c_normal.ocr.pdf
OK : TXT: sv600_c_normal.ocr.txt

ricoh hat da OCR Test scans
https://www.pfu.ricoh.com/global/scanners/scansnap/support/sample/sv600.html
Ergänzung ()

und wenn was schief geht:
DEBUG=1 KEEP_WORKDIR=1 bash ocr_tess_allinone.sh sv600_c_normal.pdf
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: BFF und mischaef
mischaef schrieb:
Kennt jemand zufällig eine KI, die dafür genutzt werden kann und die zuverlässig arbeitet? Auch gerne lokal, wenn keine Nvidia-Karte benötigt wird.
Moin, guck dir mal dieses Modell an: Das läuft bei mir lokal auf einer 6GB GPU unter Ollama, und ich finde die Ergebnisse gut :-) Und wenn deine Karte nicht unterstützt wird, kannst du das Teil auch in der CPU kriechen lassen. ministral-3:8b-instruct-2512-q4_K_M


LG Olav
 
  • Gefällt mir
Reaktionen: mischaef
mischaef schrieb:
Gemini ist hier bei der Erkennung zwar sehr gut, haut mir aber alle Texte in Blocksatz raus, sprich, reiht einen Satz an den anderen und achtet oftmals nicht auf Zeilenumbrüche, also wann im Text ein Satz in einer neuen Zeile anfängt. Damit geht die komplette Formatierung verloren, was sehr schade ist.
Der Grund dafür liegt in der Natur der aktuellen "Chat-KIs" (wie Gemini oder ChatGPT): Es sind Sprachmodelle, keine Layout-Engines. Sie sehen den Text als eine Kette von Wörtern (Tokens) und versuchen, den Inhalt wiederzugeben, "denken" aber nicht in pixelgeometrischen Positionen oder Zeilenumbrüchen.

Wenn du das Layout (Zeilenumbrüche, Absätze) erhalten willst, brauchst du eigentlich keine "generative KI" (die Text erfindet), sondern eine dedizierte OCR-Software, die auf Layout-Analyse spezialisiert ist.

Vielleicht versuchst du es mal mit NAPS2 (Not Another PDF Scanner 2). Das ist zwar keine "Chat-KI", nutzt aber unter der Haube Tesseract (eine von Google entwickelte OCR-Engine, die auf neuronalen Netzen basiert, also auch eine Form von KI).

Sofern du technisch etwas versierter bist und Python magst, gibt es KI-Modelle auf Github, die speziell darauf trainiert wurden, Layouts in Markdown umzuwandeln.

Achja, frohes neues Jahr!
 
Zurück
Oben