Die Dokumentenanalyse ist ein mächtiges Werkzeug, um Änderungen, Kommentare und Inhalte aus verschiedenen Dateiformaten zu extrahieren und zu verstehen. Ob es um die Nachverfolgung von Bearbeitungen in Word-Dokumenten (.docx), die Analyse von Text in PowerPoint-Präsentationen (.pptx) oder das Erkunden älterer .doc-Dateien geht – dieses Python-Skript bietet eine flexible Lösung. Mit Unterstützung für Excel- und SQLite-Ausgabe kannst du die Ergebnisse effizient speichern und weiterverarbeiten. In diesem Beitrag stelle ich den Code vor, erkläre seine Funktionen und zeige dir, wie du ihn in unterschiedlichsten Szenarien einsetzen kannst.


Was macht das Tool?

Das Skript analysiert einen Ordner (inklusive Unterordner) nach .docx-, .pptx- und .doc-Dateien:

  • Word (.docx): Extrahiert Einfügungen (<w:ins>) und Löschungen (<w:del>) mit Autor, Datum und Text.
  • PowerPoint (.pptx): Sammelt Text aus Folien (ohne direkte Revisionen, da diese nicht standardmäßig verfügbar sind).
  • Word (.doc): Bietet eine Basisimplementierung für ältere Dateien (erweiterbar). Die Ergebnisse werden in einer Excel-Datei und einer SQLite-Datenbank gespeichert – ideal für weitere Analysen oder Archivierung.

Installation

Du benötigst folgende Python-Bibliotheken:

  • lxml: Zum Parsen von XML in .docx-Dateien.
  • pandas: Für die Excel-Ausgabe.
  • openpyxl: Als Engine für Excel-Dateien.
  • python-pptx: Zum Lesen von .pptx-Dateien.
  • olefile: Für den Zugriff auf .doc-Dateien.
  • sqlite3: Standardbibliothek für SQLite-Datenbanken.

Installiere sie mit:

bash

pip install lxml pandas openpyxl python-pptx olefile

Stelle sicher, dass Python 3.8+ installiert ist. Die sqlite3-Bibliothek ist bereits enthalten.


Der Quellcode

Hier ist der vollständige Code:

python

import os
from zipfile import ZipFile, BadZipFile
from lxml import etree
import pandas as pd
from olefile import OleFileIO
from pptx import Presentation
import sqlite3

def list_revisions_docx(docx_path):
    revisions = []
    try:
        with ZipFile(docx_path, 'r') as docx:
            with docx.open('word/document.xml') as file:
                xml_content = file.read()
        
        tree = etree.XML(xml_content)
        namespace = {'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'}
        
        ins_elements = tree.xpath('//w:ins', namespaces=namespace)
        del_elements = tree.xpath('//w:del', namespaces=namespace)

        for ins in ins_elements:
            author = ins.get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}author', 'Unbekannt')
            date = ins.get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}date', 'Unbekannt')
            text = ''.join(ins.xpath('.//text()', namespaces=namespace))
            revisions.append({
                'Type': 'Einfügung',
                'Author': author,
                'Date': date,
                'Text': text
            })
        
        for d in del_elements:
            author = d.get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}author', 'Unbekannt')
            date = d.get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}date', 'Unbekannt')
            text = ''.join(d.xpath('.//text()', namespaces=namespace))
            revisions.append({
                'Type': 'Löschung',
                'Author': author,
                'Date': date,
                'Text': text
            })

    except BadZipFile:
        print(f"Die Datei {docx_path} ist keine gültige ZIP-Datei oder beschädigt.")
    except Exception as e:
        print(f"Fehler beim Verarbeiten der Datei {docx_path}: {e}")

    return revisions

def list_revisions_pptx(pptx_path):
    revisions = []
    try:
        presentation = Presentation(pptx_path)
        metadata = {'Author': 'Unbekannt', 'Date': 'Unbekannt', 'Text': []}
        
        for slide in presentation.slides:
            for shape in slide.shapes:
                if shape.has_text_frame:
                    for paragraph in shape.text_frame.paragraphs:
                        for run in paragraph.runs:
                            metadata['Text'].append(run.text)
        
        for text in metadata['Text']:
            revisions.append({
                'Type': 'Text',
                'Author': metadata['Author'],
                'Date': metadata['Date'],
                'Text': text
            })
    except Exception as e:
        print(f"Fehler beim Verarbeiten der Datei {pptx_path}: {e}")

    return revisions

def list_revisions_doc(doc_path):
    revisions = []
    try:
        ole = OleFileIO(doc_path)
        if ole.exists('WordDocument'):
            revisions.append({
                'Type': 'Text',
                'Author': 'Unbekannt',
                'Date': 'Unbekannt',
                'Text': 'Inhalt aus .doc nicht extrahiert.'
            })
        ole.close()
    except Exception as e:
        print(f"Fehler beim Verarbeiten der Datei {doc_path}: {e}")

    return revisions

def analyze_directory(directory_path):
    all_revisions = []
    for root, _, files in os.walk(directory_path):
        for file in files:
            file_path = os.path.join(root, file)
            if file.lower().endswith('.docx'):
                revisions = list_revisions_docx(file_path)
            elif file.lower().endswith('.pptx'):
                revisions = list_revisions_pptx(file_path)
            elif file.lower().endswith('.doc'):
                revisions = list_revisions_doc(file_path)
            else:
                continue

            for rev in revisions:
                all_revisions.append({
                    'File': file,
                    'Path': file_path,
                    'Type': rev['Type'],
                    'Author': rev['Author'],
                    'Date': rev['Date'],
                    'Text': rev['Text']
                })

    return all_revisions

def save_to_excel(data, output_path):
    df = pd.DataFrame(data)
    with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
        df.to_excel(writer, sheet_name='Revisions', index=False)
        workbook = writer.book
        worksheet = writer.sheets['Revisions']
        worksheet.auto_filter.ref = worksheet.dimensions
        for col in worksheet.columns:
            max_length = max(len(str(cell.value)) for cell in col)
            worksheet.column_dimensions[col[0].column_letter].width = max_length + 2

def save_to_sqlite(data, db_path):
    conn = sqlite3.connect(db_path)
    c = conn.cursor()
    c.execute('''
        CREATE TABLE IF NOT EXISTS revisions (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            file TEXT,
            path TEXT,
            type TEXT,
            author TEXT,
            date TEXT,
            text TEXT
        )
    ''')
    for entry in data:
        c.execute('''
            INSERT INTO revisions (file, path, type, author, date, text)
            VALUES (?, ?, ?, ?, ?, ?)
        ''', (entry['File'], entry['Path'], entry['Type'], entry['Author'], entry['Date'], entry['Text']))
    conn.commit()
    conn.close()

# Beispielaufruf
directory_path = 'I:\\_leaks\\RKI\\Zusatzmaterial_2020-2023\\Zusatzmaterial 2020-2023'
revisions_data = analyze_directory(directory_path)
output_excel_path = 'Protokoll.xlsx'
save_to_excel(revisions_data, output_excel_path)
print(f'Protokoll wurde erstellt: {output_excel_path}')
output_db_path = 'revisions.db'
save_to_sqlite(revisions_data, output_db_path)
print(f'Datenbank wurde erstellt: {output_db_path}')

Speichere den Code in revision_extractor.py und starte ihn mit python revision_extractor.py. Passe den directory_path an deinen Ordner an.


Einsatzszenarien

Dieses Tool ist vielseitig. Hier sind einige Anwendungsfälle:

  1. Historische Dokumentenanalyse
    Forscher können Änderungen in alten .doc-Dateien oder modernen .docx-Dokumenten untersuchen, z. B. für die Arbeit mit Archiven. Kombiniere es mit Zotero für Quellenverwaltung.
  2. Unternehmens-Compliance
    Prüfe Bearbeitungen in Verträgen oder Berichten, um sicherzustellen, dass Vorschriften eingehalten wurden. Nutze es mit DocuSign für digitale Workflows.
  3. Präsentationsmanagement
    Extrahiere Text aus .pptx-Dateien, um Inhalte für Schulungen oder Marketing zu überprüfen. Integriere es mit Canva für Design-Workflows.
  4. IT-Forensik
    Analysiere geleakte Dokumente (wie im Beispielpfad) auf Änderungen und Metadaten. Ergänze es mit Wireshark für Netzwerkanalysen.
  5. Bildungswesen
    Lehrer können Schülerarbeiten in .docx prüfen, um Plagiate oder Bearbeitungen zu erkennen. Nutze es mit Turnitin für Plagiatsprüfungen.
  6. Projektkoordination
    Verfolge Änderungen in Projektdokumentationen über Microsoft Teams oder SharePoint.
  7. Datenbankarchivierung
    Speichere Revisionen in SQLite für langfristige Analysen, z. B. mit DB Browser for SQLite.

Warum dieses Tool nutzen?

  • Vielseitigkeit: Unterstützt .docx, .pptx und .doc.
  • Doppelte Ausgabe: Excel für schnelle Einsicht, SQLite für strukturierte Daten.
  • Robustheit: Fehlerbehandlung für beschädigte Dateien.
  • Erweiterbarkeit: Passe es an andere Formate wie PDF mit PyPDF2 an.

Erweiterungsmöglichkeiten

  • GUI hinzufügen: Nutze PyQt6 für eine Benutzeroberfläche.
  • Metadaten erweitern: Hole mehr Infos aus .pptx mit python-pptx.
  • Visualisierung: Analysiere Daten mit Matplotlib oder Power BI.

Fazit

Dieses Skript ist ein starkes Werkzeug für die Dokumentenanalyse, egal ob du Revisionen nachverfolgen, Präsentationen auswerten oder alte Dateien untersuchen willst. Mit Excel- und SQLite-Ausgabe bist du flexibel für weitere Schritte.


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert