\n

PDFs, E-Mails, Dokumente: Alles wird zugänglich

\n

Jeder Dokumenttyp hat seine Eigenarten. PDFs verstecken Text in komplexen Layern, E-Mails sind in archaischen Formaten strukturiert, Word-Dokumente mischen Content mit Formatierung. Diese Formate zu knacken und den wertvollen Text zu extrahieren ist handwerkliche Arbeit, aber lösbar.

\n

PDF-Extraktion ist oft der schwierigste Teil. Moderne PDFs enthalten echten Text, alte oder gescannte PDFs sind im Grunde Bilder. Dazwischen gibt es alle Arten von Zwischenlösungen mit verschiedenen Encoding-Problemen und Layout-Herausforderungen.

\n
\n

Document Processing ist zu 80% Problemlösung für Edge Cases. Das Standard-Happy-Path-PDF funktioniert einfach, aber korrupte, verschlüsselte oder schlecht formatierte Dokumente erfordern robusten Error-Handling und Fallback-Strategien.

\n
\n

Verschiedene PDF-Libraries haben verschiedene Stärken. PyPDF2 ist einfach aber limitiert, pdfplumber behält Layout-Informationen, pymupdf ist schnell und feature-rich. Für robuste Systeme brauchst Du oft mehrere Tools als Fallbacks.

\n

Multi-Tool-PDF-Extraktion:

\n

def extract_pdf_text(file_path):

\n

  # Versuch 1: PyMuPDF (schnell, robust)

\n

  try:

\n

    import fitz

\n

    doc = fitz.open(file_path)

\n

    text = ""

\n

    for page in doc:

\n

      text += page.get_text()

\n

    if len(text.strip()) > 100: # Mindest-Content

\n

      return text

\n

  except:

\n

    pass

\n

  # Versuch 2: pdfplumber (besseres Layout)

\n

  try:

\n

    import pdfplumber

\n

    with pdfplumber.open(file_path) as pdf:

\n

      return '\\n'.join([page.extract_text() for page in pdf.pages])

\n

  except:

\n

    return None

\n

OCR für gescannte PDFs ist ein eigenes Thema. Tesseract ist der Standard für Open-Source-OCR, aber es braucht gute Preprocessing: Kontrast-Anpassung, Noise-Removal, Rotation-Correction. Die Qualität schwankt stark je nach Scan-Qualität.

\n
\n

Vielleicht magst Du OCR als separaten Schritt behandeln. Erst versuchen normalen Text zu extrahieren, nur bei Bedarf OCR anwenden. Das spart Zeit und Ressourcen für die 90% der PDFs, die echten Text enthalten.

\n
\n

E-Mail-Verarbeitung ist komplex wegen der verschiedenen Formate. MBOX-Dateien von Thunderbird, PST-Files von Outlook, EML-Files als Einzelnachrichten - jedes Format braucht einen eigenen Parser. Und dann sind da noch Attachments, HTML vs. Plain-Text, Encoding-Issues.

\n

E-Mail-Extraktion multi-format:

\n

MBOX-Dateien (Thunderbird, Apple Mail)

\n

import mailbox

\n

for message in mailbox.mbox('inbox.mbox'):

\n

  subject = message['Subject']

\n

  body = message.get_payload(decode=True)

\n

EML-Dateien (Einzelnachrichten)

\n

import email

\n

with open('message.eml', 'r') as f:

\n

  msg = email.message_from_file(f)

\n

  subject = msg['Subject']

\n

  body = msg.get_payload()

\n

PST-Dateien (Outlook) - benötigt libpst

\n

import pypff

\n

pst = pypff.file()

\n

pst.open('outlook.pst')

\n

HTML-Cleanup in E-Mails ist essentiell. E-Mail-HTML ist oft schlecht formatiert und voller Tracking-Pixel und Layout-Code. BeautifulSoup oder html2text extrahieren den reinen Text und entfernen den HTML-Ballast.

\n
\n

E-Mail-Privacy: E-Mails enthalten persönliche und vertrauliche Informationen. Überlege Dir genau, was Du indexierst und wie lange Du es aufbewahrst. Compliance-Regeln können hier relevant sein.

\n
\n

Word-Dokumente sind relativ einfach mit python-docx. Das Library versteht die DOCX-Struktur und extrahiert Text, Tabellen und Metadaten sauber. Alte DOC-Dateien sind schwieriger und brauchen oft LibreOffice als Konverter.

\n

Office-Dokumente verarbeiten:

\n

DOCX-Dateien

\n

import docx

\n

doc = docx.Document('document.docx')

\n

text = '\\n'.join([paragraph.text for paragraph in doc.paragraphs])

\n

Tabellen extrahieren

\n

for table in doc.tables:

\n

  for row in table.rows:

\n

    row_data = [cell.text for cell in row.cells]

\n

PowerPoint (PPTX)

\n

from pptx import Presentation

\n

prs = Presentation('presentation.pptx')

\n

for slide in prs.slides:

\n

  for shape in slide.shapes:

\n

    if hasattr(shape, "text"):

\n

      text += shape.text

\n

Encoding-Probleme sind der Fluch der Dokumenten-Verarbeitung. UTF-8, Latin-1, Windows-1252, und dutzende andere Encodings können in einem einzigen Archiv vorkommen. Chardet hilft bei der automatischen Encoding-Erkennung, aber 100% perfekt ist es nie.

\n
\n

Encoding-Realität: Plane für Encoding-Fehler. Nicht jedes Dokument lässt sich perfekt dekodieren. Graceful Degradation und Fallback zu "ignore" oder "replace" Strategien sind praktischer als perfekte Encoding-Behandlung.

\n
\n

Batch-Processing-Pipeline für große Dokumentenmengen braucht sorgfältige Planung. Memory-Management, parallele Verarbeitung, Progress-Tracking, Error-Recovery - ein robustes System ist deutlich komplexer als ein einfacher Script.

\n

Robuste Batch-Processing-Pipeline:

\n

import multiprocessing as mp

\n

from concurrent.futures import ProcessPoolExecutor

\n

def process_document(file_path):

\n

  try:

\n

    # Text extrahieren

\n

    text = extract_text(file_path)

\n

    # Embeddings generieren

\n

    embedding = generate_embedding(text)

\n

    # In ChromaDB speichern

\n

    store_in_chromadb(file_path, text, embedding)

\n

    return {"status": "success", "file": file_path}

\n

  except Exception as e:

\n

    return {"status": "error", "file": file_path, "error": str(e)}

\n

Parallelverarbeitung

\n

with ProcessPoolExecutor(max_workers=4) as executor:

\n

  results = executor.map(process_document, file_list)

\n

Tabellen und strukturierte Daten aus Dokumenten zu extrahieren ist eine Kunst für sich. PDFs mit Tabellen, Excel-Dateien, CSV-Files - jedes Format hat seine Eigenarten. pandas ist oft der beste Freund für strukturierte Datenverarbeitung.

\n
\n

Es ist besser, Tabellendaten separat zu indexieren. Eine Tabelle pro ChromaDB-Eintrag, nicht das gesamte Dokument. Das macht Suchen präziser und Ergebnisse relevanter.

\n
\n

Attachments in E-Mails sind oft die wertvollsten Inhalte. Verträge, Präsentationen, Berichte - aber sie sind schwer zu finden, weil sie in E-Mails versteckt sind. Attachments extrahieren und separat indexieren macht sie durchsuchbar.

\n

E-Mail-Attachment-Extraktion:

\n

def extract_attachments(email_message, output_dir):

\n

  attachments = []

\n

  for part in email_message.walk():

\n

    if part.get_content_disposition() == 'attachment':

\n

      filename = part.get_filename()

\n

      if filename:

\n

        file_path = os.path.join(output_dir, filename)

\n

        with open(file_path, 'wb') as f:

\n

          f.write(part.get_payload(decode=True))

\n

        attachments.append(file_path)

\n

  return attachments

\n

Performance-Monitoring hilft beim Identifizieren von Bottlenecks. Welche Dokumenttypen brauchen am längsten? Wo ist RAM-Verbrauch problematisch? Diese Daten helfen bei der Optimierung der Pipeline.

\n
\n

Große Dokumente können Memory-Problems verursachen. 100MB-PDFs oder PST-Files mit Gigabyte-Größe sprengen schnell den verfügbaren RAM. Streaming-Processing oder Dokument-Splitting können helfen.

\n
\n

Metadata-Preservation ist wichtig für späteren Kontext. Wann wurde das Dokument erstellt? Wer hat es geschrieben? In welcher E-Mail war es attached? Diese Informationen machen Suchergebnisse wertvoller.

\n

Umfassendes Metadata-Schema:

\n

{

\n

  "source_type": "email_attachment",

\n

  "email_subject": "Quarterly Report Q4 2024",

\n

  "email_sender": "ceo@company.com",

\n

  "email_date": "2024-01-15T10:30:00Z",

\n

  "attachment_name": "Q4_Report.pdf",

\n

  "document_author": "Finance Team",

\n

  "document_created": "2024-01-10T14:20:00Z",

\n

  pages": 23,

\n

  "file_size": 2048576,

\n

  "extraction_method": "pymupdf"

\n

}

\n

Kontinuierliche Verbesserung der Extraction-Quality durch Feedback-Loops. Welche Dokumente wurden nicht gut extrahiert? Wo sind manuell nacharbeiten nötig? Diese Erkenntnisse fließen in bessere Preprocessing-Pipelines.

\n
\n

Document Processing ist wie Archäologie: Du gräbst wertvollen Content aus verschiedensten Formaten und Encodings aus. Geduld und robuste Tools sind wichtiger als perfekte Algorithmen.

\n
\n

Mit systematischer Dokument-Verarbeitung hast Du alle wichtigen Informationsquellen erschlossen. Jetzt können wir die wahre Kraft semantischer Suche entfalten und nach Bedeutung statt nur nach Wörtern suchen.

\n

\n