Erstellung, Bearbeitung und Analyse von DOCX-Dateien
Eine .docx-Datei ist ein ZIP-Archiv mit XML-Dateien. Wählen Sie Ihren Ansatz je nach Aufgabe:
| Aufgabe | Ansatz |
|---|---|
| Erstellen eines neuen Dokuments | Ein docx-Skript (npm) schreiben – siehe Fallstricke unten |
| Bearbeiten eines vorhandenen Dokuments | unzip → word/document.xml bearbeiten → zip (docx-js kann keine vorhandenen Dateien öffnen) |
| Lesen von Inhalten | pandoc -t markdown datei.docx |
Skriptpfade unten sind relativ zum Verzeichnis dieses Skills.
Erstellen mit docx-js – Fallstricke
docx ist vorinstalliert – führen Sie nicht npm install aus; schreiben Sie das Skript und verwenden Sie require('docx') direkt. Nur wenn dieser require fehlschlägt: npm install docx. Das Modell kennt die API; hier sind die typischen Stolpersteine:
- Seitengröße standardmäßig A4. Für US Letter setzen Sie
page: { size: { width: 12240, height: 15840 } }(DXA; 1440 = 1″). - Querformat: Übergeben Sie die Hochformatmaße und
orientation: PageOrientation.LANDSCAPE– docx-js vertauscht Breite/Höhe intern. - Tabellen benötigen doppelte Breitenangaben: Setzen Sie
columnWidthsauf der Tabelle UNDwidthauf jeder Zelle, beide inWidthType.DXA(PERCENTAGE funktioniert in Google Docs nicht). Spaltenbreiten müssen in der Summe der Tabellenbreite entsprechen. - Tabellenhintergrund: Verwenden Sie
ShadingType.CLEAR, niemalsSOLID(ergibt schwarz). - Listen: Fügen Sie niemals wörtlich
•ein; verwenden Sie einenumbering-Konfiguration mitLevelFormat.BULLET. ImageRunbenötigttype:("png","jpg", …).PageBreakmuss innerhalb einesParagraphstehen.- Verwenden Sie niemals
\n– verwenden Sie separateParagraph-Elemente. - Inhaltsverzeichnis: Überschriften müssen die integrierten
HeadingLevel.*verwenden; benutzerdefinierte Überschriftenformate benötigen ein gesetztesoutlineLevel, sonst erscheinen sie nicht. - Verwenden Sie keine Tabelle als horizontale Linie – verwenden Sie stattdessen einen unteren Absatzrand.
- Punktführer / rechtsbündig in derselben Zeile: Verwenden Sie
PositionalTab(alignment: PositionalTabAlignment.RIGHT,leader: PositionalTabLeader.DOT) innerhalb einesTextRun, nicht wörtliche.oder Leerzeichen.
Ausgabe überprüfen
Nach dem Schreiben einer .docx-Datei rendern Sie diese und sehen Sie sie an:
python scripts/office/soffice.py --headless --convert-to pdf ausgabe.docx
pdftoppm -jpeg -r 100 ausgabe.pdf seite
ls seite-*.jpg # dann die Bilder lesen
pdftoppm füllt Seitennummern mit Nullen auf die Breite der Gesamtseitenzahl auf (seite-01.jpg…seite-12.jpg).
Vorhandene Dokumente bearbeiten
Ältere .doc-Dateien müssen zuerst konvertiert werden: python scripts/office/soffice.py --headless --convert-to docx datei.doc.
unzip -q doc.docx -d entpackt/
find entpackt -type l -delete # Symlink-Einträge entfernen – docx von externen Parteien ist nicht vertrauenswürdig
python scripts/merge_runs.py entpackt/ # fragmentierte Runs zusammenführen, damit Text auffindbar ist
# entpackt/word/document.xml direkt bearbeiten – NICHT neu formatieren oder hübsch drucken
(cd entpackt && rm -f ../out.docx && zip -Xr ../out.docx .)
python scripts/office/validate.py out.docx --original doc.docx # XSD-Prüfungen; --auto-repair behebt häufige Probleme
# Änderungen verfolgen? --author "<der Name, unter dem Sie Änderungen vorgenommen haben>" hinzufügen, um zu prüfen, dass jede Bearbeitung nachverfolgt wird
Word verteilt Text über viele <w:r>-Runs (Revisions-IDs, Rechtschreibmarkierungen), sodass ein im Dokument sichtbarer Ausdruck im XML oft nicht als zusammenhängende Zeichenfolge existiert. merge_runs.py führt benachbarte, identisch formatierte Runs in word/document.xml zusammen, ohne Inhalt oder Darstellung zu ändern; es akzeptiert auch eine .docx-Datei direkt (python scripts/merge_runs.py doc.docx -o merged.docx).
Nachverfolgte Änderungen: Validieren Sie beim Überarbeiten mit --author "<der Name, unter dem Sie Änderungen vorgenommen haben>" (benötigt --original) – es meldet jeden Text, den Sie ohne umschließendes <w:ins>/<w:del> geändert haben, was leicht versehentlich passiert und in der akzeptierten Ansicht unsichtbar ist. Umschließen Sie Runs mit <w:ins>/<w:del> und den Attributen w:id, w:author, w:date. Innerhalb von <w:del> lautet das Textelement <w:delText>, nicht <w:t>. Ein gelöschtes Absatzzeichen (<w:pPr><w:rPr><w:del w:id=".." w:author=".." w:date=".."/></w:rPr></w:pPr>) bedeutet „diesen Absatz mit dem nächsten zusammenführen“ – einen Absatz komplett zu löschen besteht daher aus diesem Element plus einem <w:del> um jeden Run. Das <w:del/> muss vor den anderen Kindern des rPr kommen; ihre Reihenfolge ist schemaerzwungen.
Um eine saubere Kopie mit allen akzeptierten Änderungen zu erstellen: python scripts/accept_changes.py in.docx out.docx.
Das Akzeptieren eines gelöschten Absatzzeichens sollte diesen Absatz mit dem darunterliegenden verbinden, sodass ein Absatz, dessen Runs alle gelöscht sind, verschwindet. Word macht das; accept_changes.py und pandoc --track-changes=accept tun es nicht immer. Beide scheitern auf die gleiche Weise – sie entfernen den gelöschten Text, lassen aber den leeren Absatz zurück, der sich bei automatischer Nummerierung als unerwartetes leeres Aufzählungszeichen liest:
pandoc --track-changes=acceptverbindet die Absätze nie.accept_changes.py(LibreOffice) verbindet sie korrekt, außer wenn der gelöschte Absatz von einem leeren Abstandsabsatz gefolgt wird.
Ein leeres Aufzählungszeichen in einer der beiden Ansichten ist ein Artefakt dieser Ansicht, kein Fehler im Dokument. Überprüfen Sie Absatzlöschungen im XML.
Kommentare
Kommentare erfordern sechs miteinander verknüpfte Dateien. Verwenden Sie das Hilfsskript – Verzeichnismodus, wenn Sie auch document.xml bearbeiten (spart einen Entpack-/Wiederverpackungszyklus), andernfalls im .docx-Direktmodus:
# Gegen ein bereits entpacktes Verzeichnis (bevorzugt, wenn auch Marker gesetzt werden)
python scripts/comment.py entpackt/ "Gebühren- & Ausgabendeckel ist zu niedrig"
python scripts/comment.py entpackt/ "Einverstanden" --parent 0
# Gegen eine .docx-Datei direkt
python scripts/comment.py vertrag.docx "Dieser Deckel ist zu niedrig" -o annotiert.docx
Das Skript schreibt comments.xml, commentsExtended.xml, commentsIds.xml, commentsExtensible.xml, die Beziehungen und die Content-Type-Überschreibungen. Kommentar-IDs werden automatisch vergeben. Dann gibt es den <w:commentRangeStart>-/<w:commentRangeEnd>-/<w:commentReference>-Ausschnitt aus, der zu word/document.xml hinzugefügt werden muss, damit der Kommentar an einem bestimmten Text verankert wird – bis Sie diese Marker platzieren, existiert der Kommentar, ist aber nicht sichtbar.
Abhängigkeiten
docx (npm, vorinstalliert – nur installieren, wenn require('docx') fehlschlägt) · pandoc · LibreOffice (soffice) · pdftoppm (Poppler)