Docx-Fähigkeit (Docx Skill)
Erstellen, Lesen, Bearbeiten und Vorlagen für Microsoft Word .docx-Dateien mit python-docx über kleine CLIs. Sie behandelt Text, Stile, Listen, Tabellen, Bilder, Kopf-/Fußzeilen, {{token}}-Vorlagen, nachverfolgte Änderungen (anzeigen/akzeptieren/ablehnen), Kommentare (anzeigen/hinzufügen/löschen), Inhaltsverzeichnis- und Seitenzahl-Felder sowie Paket-Integritätsprüfungen. Sie rendert keine Dokumente selbst (PDF benötigt LibreOffice – siehe Umwandlung in PDF) und bearbeitet keine veralteten .doc-Dateien.
Wann verwenden
- Der Benutzer bittet um die Erstellung eines Word-Dokuments (Bericht, Brief, Vertrag).
- Sie benötigen den Text, die Gliederung, Stile oder eingebettete Bilder eines
.docx. - Sie müssen ein vorhandenes
.docxändern: Text ersetzen, Tabellenzellen bearbeiten, Absätze einfügen/löschen, Stile anwenden, fragmentierte Läufe (Runs) zusammenführen. - Sie haben eine
.docx-Vorlage mit{{Platzhaltern}}, die mit Daten gefüllt werden müssen. - Das Dokument enthält nachverfolgte Änderungen, die geprüft, akzeptiert oder abgelehnt werden sollen.
- Sie müssen Kommentare von Prüfern lesen oder Kommentare hinzufügen/löschen.
- Eine
.docx-Datei lässt sich nicht öffnen oder verhält sich seltsam, und Sie müssen eine Fehlerbehebung (Triage) durchführen. - Das Dokument benötigt ein Inhaltsverzeichnis oder eine "Seite X von Y"-Fußzeile.
- Nicht geeignet für:
.doc(alt),.odtoder WYSIWYG-Layout-Arbeiten.
Voraussetzungen
- Python 3.10+ mit installiertem
python-docx:pip install python-docx(der Importname istdocx; lxml wird damit installiert). comments addverwendet die native API für python-docx >= 1.2 und einen XML-Fallback auf älteren Versionen – beides geschieht automatisch.- Für Bildblöcke: Die Bilddateien müssen lokal vorhanden sein (PNG/JPEG).
Ausführung
Alle Helfer befinden sich im Verzeichnis scripts/ neben dieser Datei. Führen Sie sie mit dem terminal-Werkzeug aus; jedes unterstützt --help und gibt JSON auf stdout aus.
python scripts/docx_create.py spec.json out.docx
python scripts/docx_read.py out.docx --text
python scripts/docx_edit.py replace out.docx --find old --replace new
python scripts/docx_template.py tpl.docx values.json filled.docx
python scripts/docx_revisions.py list out.docx
python scripts/docx_comments.py list out.docx
python scripts/docx_validate.py out.docx
Kurzreferenz
| Aufgabe | Befehl |
|---|---|
| Aus JSON-Spezifikation erstellen | docx_create.py spec.json out.docx |
| Volltext (Textkörper+Tabellen+Kopf-/Fußzeilen) | docx_read.py f.docx --text |
| Überschrift-Gliederung + Tabellenformen | docx_read.py f.docx --structure |
| Tatsächlich verwendete Stile | docx_read.py f.docx --styles |
| Eingebettete Bilder extrahieren | docx_read.py f.docx --images outdir/ |
| Nachverfolgte Änderungen/Kommentare erkennen | docx_read.py f.docx --revisions |
| Suchen/Ersetzen (Formatierung bleibt erhalten) | docx_edit.py replace f.docx --find A --replace B -o out.docx |
| Tabellenzelle setzen | docx_edit.py set-cell f.docx --table 0 --row 1 --col 2 --text X |
| Absatz vor Index N einfügen | docx_edit.py insert f.docx --index N --text X --style Normal |
| Absatz N löschen | docx_edit.py delete f.docx --index N |
| Stil auf Absatz N anwenden | docx_edit.py style f.docx --index N --style "Heading 1" |
| Benachbarte Läufe mit gleicher Formatierung zusammenführen | docx_edit.py normalize f.docx -o out.docx |
| TOC-Feld vor Absatz N einfügen | docx_edit.py toc f.docx --index N -o out.docx |
| "Seite X von Y"-Fußzeilenfelder | docx_edit.py page-numbers f.docx |
{{tokens}} füllen | docx_template.py tpl.docx values.json out.docx --strict |
| Änderungen auflisten (ID/Autor/Datum/Text) | docx_revisions.py list f.docx |
| Alle Änderungen akzeptieren / ablehnen | docx_revisions.py accept-all f.docx -o out.docx (oder reject-all) |
| Eine einzelne Änderung akzeptieren / ablehnen | docx_revisions.py accept f.docx --id 3 -o out.docx |
| Kommentare auflisten (+verankerter Text) | docx_comments.py list f.docx |
| Kommentar zu Text hinzufügen | docx_comments.py add f.docx --target "Satzteil" --text "Notiz" --author You |
| Kommentar nach ID löschen | docx_comments.py delete f.docx --id 0 |
| Integritätsprüfung des Pakets | docx_validate.py f.docx (Exit-Code 1 bei Fehlern) |
Vorgehensweise
- Erstellen. Schreiben Sie eine JSON-Spezifikation mit
write_fileund führen Sie dannscripts/docx_create.pyaus. Die Spezifikation unterstützt:page(Größe und Ränder in mm),header/footer-Zeichenketten,footer_page_numbers(fügt "Seite X von Y"-Fußzeilenfeld hinzu),styles(benutzerdefinierte Absatzstile mit Schriftart, Größe, fett/kursiv, hexcolor) undblocks–heading(Ebene 1-9),paragraph(entwedertextoder eineruns-Liste, bei der jeder Laufbold/italic/underlinesetzen kann),bullet_list,numbered_list,table(header-Zeile wird fett gerendert,rows, optionaler integrierterstylewieTable Grid),image(path, optionalwidth_mm),toc(Inhaltsverzeichnis-Feld) undpage_break. Das vollständige Spezifikationsformat ist oben inscripts/docx_create.pydokumentiert. - Lesen. Verwenden Sie
scripts/docx_read.pymit genau einem Modus-Flag.--textgibt Absätze des Textkörpers, allen Text aus Tabellenzellen sowie Kopf-/Fußzeilentext als JSON zurück.--structuregibt die Überschriften-Gliederung plus Anzahl der Absätze/Tabellen/Abschnitte zurück.--images DIRkopiert alle Dateien ausword/media/aus dem Paket. - Bearbeiten. Verwenden Sie
scripts/docx_edit.py.replacedurchläuft Textkörper, Tabellen (auch verschachtelte), Kopf- und Fußzeilen und bewahrt die Lauf-Formatierung; fügen Sie--body-onlyhinzu, um Kopf-/Fußzeilen zu überspringen. Übergeben Sie-o out.docx, um das Original zu erhalten; lassen Sie es weg, um direkt zu bearbeiten. Absatzindizes fürinsert/delete/style/tocbeziehen sich auf die--structure/--text-Reihenfolge des Textkörpers. Führen Sie zuerstnormalizefür Dokumente aus, die viel in Word bearbeitet wurden – es führt benachbarte Läufe mit identischer Formatierung zusammen, sodass spätere Suchen/Ersetzen zuverlässig funktionieren. - Änderungen prüfen.
docx_revisions.py listmeldet jedesw:insundw:del(ID, Autor, Datum, betroffener Text) im Textkörper, in Tabellen, Kopf- oder Fußzeilen.accept-all/reject-allerledigt sie in einem Rutsch;accept/reject --id Nbehandelt eine einzelne Änderung. Akzeptieren behält Einfügungen und verwirft gelöschten Text; Ablehnen macht das Gegenteil. - Kommentare.
docx_comments.py listgibt für jeden Kommentar ID, Autor, Datum, Text und den verankerten Dokumenttext zurück.add --target "ein Satzteil"verankert einen neuen Kommentar am ersten Vorkommen dieses Satzteils (Läufe werden bei Bedarf geteilt; Formatierung bleibt erhalten).delete --id Nentfernt den Kommentar und seine Markierungen, ohne den Dokumenttext zu berühren. - Vorlage. Setzen Sie
{{name}}-artige Platzhalter in das Dokument. Führen Siescripts/docx_template.pymit einem JSON-Objekt der Werte aus. Verwenden Sie--strict, um einen Fehler zu melden, wenn Platzhalter unausgefüllt bleiben; die JSON-Ausgabe listet in jedem Fallfilled-Anzahl undunfilled_tokensauf. - Überprüfen (immer): Lesen Sie die Ausgabe mit
--textoder--structureerneut ein, und führen Siedocx_validate.pyauf alles aus, das Sie durch Änderungs-/Kommentar-Operationen erstellt haben.
Umwandlung in PDF
Kein Skript erforderlich. Wenn LibreOffice installiert ist, konvertieren Sie ohne GUI:
soffice --headless --convert-to pdf --outdir outdir/ file.docx
Überprüfen Sie zuerst die Verfügbarkeit (command -v soffice || command -v libreoffice). Wenn keines existiert, teilen Sie dem Benutzer mit, dass die PDF-Konvertierung in dieser Umgebung nicht verfügbar ist, anstatt improvisieren – python-docx kann keine PDFs rendern, und Layout-Treue erfordert einen echten Renderer.
Fallstricke
- Platzhalter über Läufe hinweg aufgeteilt. Word fragmentiert Text oft in mehrere Läufe. Die Ersetzungshelfer lassen übereinstimmende Läufe kollabieren (die Ersetzung übernimmt die Formatierung des ersten Laufs); die vorherige Ausführung von
docx_edit.py normalizereduziert die Fragmentierung für alle späteren Bearbeitungen. - Abdeckung von Änderungen.
docx_revisions.pylöst lauf-basierte Einfügungen und Löschungen auf (die überwältigende Mehrheit). Absatzmarkierungs- und Tabellenzeilenänderungen, Formatierungsänderungen und Verschiebungen werden von--revisionserkannt, aber nicht automatisch aufgelöst – siehereferences/revisions-and-comments.mdund überlassen Sie diese Word. - Kommentar-Threading. Antworten und der Status "erledigt" befinden sich in
commentsExtended.xml, das diese Fähigkeit ignoriert; hinzugefügte Kommentare sind einfache Kommentare der obersten Ebene. - Feldergebnisse werden von Word berechnet.
toc,page-numbersund dietoc/footer_page_numbers-Spezifikationsoptionen schreiben Feldcodes. Word/LibreOffice füllt die eigentlichen Einträge und Nummern, wenn die Datei geöffnet wird (Word fordert möglicherweise zum Aktualisieren der Felder auf); python-docx berechnet sie nie, daher wird bis dahin Platzhaltertext angezeigt. - Validierung ist eine Gesundheitsprüfung, keine Schema-Validierung.
docx_validate.pyüberprüft das ZIP, erforderliche Teile, Beziehungsziele, Bild-Magic-Bytes und referenzierte Stile. Es ist KEINE XSD-Validierung – eine Datei kann bestehen und trotzdem XML enthalten, das Word nicht mag. - Stilnamen müssen existieren. Das Anwenden eines Stils, der nicht im Dokument definiert ist, löst eine
KeyError-Ausnahme aus. Integrierte Stile wieHeading 1,List Bullet,List Number,Table Gridsind in der Standardvorlage vorhanden; benutzerdefinierte Stile müssen zuerst in der Erstellungsspezifikation deklariert werden. - Nummerierte Listen setzen zurück.
List Numberverlässt sich auf die Standardnummerierung von Word; separate Listen in einem Dokument können die Nummerierung fortsetzen anstatt neu zu beginnen. Warnen Sie Benutzer, die eine präzise Nummerierung für mehrere Listen benötigen. - Zellen-Schreibzugriffe ersetzen Formatierung.
set-cellverwendetcell.text = ..., was die Läufe in dieser Zelle auf einfache Formatierung zurücksetzt. - Kodierung. Alle JSON-Spezifikations-/Wertedateien werden explizit als UTF-8 gelesen; verlassen Sie sich nie auf lokale Standardeinstellungen, wenn Sie eigenen Klebecode schreiben.
- Nicht das XML entpacken und mit sed bearbeiten. Bearbeiten Sie über die Skripte (oder python-docx); rohe Textersetzung in
document.xmlbeschädigt Dateien leicht. Verwenden Siepatch/write_filenur für die JSON-Eingaben, niemals für die.docx-Datei selbst.
Überprüfung
- Führen Sie nach dem Erstellen/Bearbeiten/Vorlagen
docx_read.py out.docx --textaus und prüfen Sie, ob die erwarteten Zeichenketten erscheinen (und alte Zeichenketten verschwunden sind). - Nach dem Akzeptieren/Ablehnen sollte
docx_revisions.py list[]zurückgeben (oder nur die IDs, die Sie absichtlich übrig gelassen haben); nach Kommentar-Operationen solltedocx_comments.py listdie Änderung widerspiegeln und die--text-Ausgabe muss unverändert sein. docx_validate.py out.docxbeendet sich mit 0 und"ok": truebei einem gesunden Paket – führen Sie es nach jeder Änderungs-/Kommentar-/Feld-Manipulation aus.- Für Vorlagen, die mit
--strictausgeführt wurden, oder prüfen Sieunfilled_tokens == []. - Strukturprüfungen:
--structuresollte die erwartete Überschriften-Gliederung und Tabellenformen anzeigen;--stylesbestätigt angewendete benutzerdefinierte Stile.