DOCX erstellen, bearbeiten und analysieren
Eine .docx-Datei ist ein ZIP-Archiv von XML-Dateien. Wählen Sie den 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 dieser Fertigkeit.
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 Stolperfallen:
- Seitengröße standardmäßig A4. Für US Letter setzen Sie
page: { size: { width: 12240, height: 15840 } }(DXA; 1440 = 1″). - Querformat: Übergeben Sie Hochformat-Maß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 bricht in Google Docs). Die Spaltenbreiten müssen in der Summe die Tabellenbreite ergeben. - Tabellenschattierung: Verwenden Sie
ShadingType.CLEAR, niemalsSOLID(ergibt schwarze Füllung). - 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ötigenoutlineLevel, 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 rendern Sie sie 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 Seitenanzahl 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 dok.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 Läufe zusammenführen, damit Text auffindbar ist
# entpackt/word/document.xml direkt bearbeiten – NICHT neu formatieren oder hübsch drucken
(cd entpackt && rm -f ../ausgabe.docx && zip -Xr ../ausgabe.docx .)
python scripts/office/validate.py ausgabe.docx --original dok.docx # XSD-Prüfungen; --auto-repair behebt häufige Probleme
# Änderungsverfolgung? --author "<der Name, unter dem Sie Änderungen markiert haben>" hinzufügen, um zu prüfen, dass jede Bearbeitung nachverfolgt ist
Word verteilt Text über viele <w:r>-Läufe (Revisions-IDs, Rechtschreibprüfungsmarkierungen), daher existiert ein sichtbarer Satz oft nicht als zusammenhängende Zeichenkette im XML. merge_runs.py führt benachbarte, identisch formatierte Läufe in word/document.xml zusammen, ohne Inhalt oder Darstellung zu ändern; es akzeptiert auch eine .docx direkt (python scripts/merge_runs.py dok.docx -o zusammengefuehrt.docx).
Änderungsverfolgung: Wenn Sie Änderungen markieren, validieren Sie mit --author "<der Name, unter dem Sie Änderungen markiert haben>" (benötigt --original) – es meldet jeglichen Text, den Sie geändert haben, ohne dass ein <w:ins>/<w:del> darum herum ist, was leicht versehentlich passiert und in der akzeptierten Ansicht unsichtbar ist. Wickeln Sie Läufe in <w:ins>/<w:del> mit den Attributen w:id, w:author, w:date ein. Innerhalb von <w:del> ist das Textelement <w:delText>, nicht <w:t>. Ein gelöschtes Absatzendezeichen (<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“ – das direkte Löschen eines Absatzes ist dies plus ein <w:del> um jeden Lauf. Das <w:del/> muss vor den anderen Kindern des rPr stehen; ihre Reihenfolge ist schemabedingt.
Um eine saubere Kopie mit allen akzeptierten Änderungen zu erstellen: python scripts/accept_changes.py eingabe.docx ausgabe.docx.
Das Akzeptieren eines gelöschten Absatzendezeichens sollte diesen Absatz mit dem darunter liegenden verbinden, sodass ein Absatz, dessen Läufe alle gelöscht sind, verschwindet. Word macht das; accept_changes.py und pandoc --track-changes=accept tun das nicht immer. Beide scheitern auf die gleiche Weise – sie entfernen den gelöschten Text, lassen aber den leeren Absatz zurück, der bei automatischer Nummerierung wie ein verlorener leerer Aufzählungspunkt wirkt:
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 leerer Aufzählungspunkt in einer der Ansichten ist ein Artefakt dieser Ansicht, kein Fehler im Dokument. Überprüfen Sie Absatzlöschungen im XML.
Kommentare
Kommentare benötigen sechs verknüpfte Dateien. Verwenden Sie das Hilfsprogramm – den Verzeichnismodus, wenn Sie auch document.xml bearbeiten (spart einen unzip/rezip-Zyklus), den .docx-Direktmodus andernfalls:
# Gegen ein bereits entpacktes Verzeichnis (bevorzugt, wenn auch Markierungen gesetzt werden)
python scripts/comment.py entpackt/ "Gebühren- & Ausgabenobergrenze ist zu niedrig"
python scripts/comment.py entpackt/ "Einverstanden" --parent 0
# Gegen eine .docx direkt
python scripts/comment.py vertrag.docx "Diese Obergrenze ist zu niedrig" -o kommentiert.docx
Das Skript schreibt comments.xml, commentsExtended.xml, commentsIds.xml, commentsExtensible.xml, die Beziehungen und die Inhaltstyp-Überschreibungen. Kommentar-IDs werden automatisch vergeben. Anschließend gibt es den <w:commentRangeStart>/<w:commentRangeEnd>/<w:commentReference>-Ausschnitt aus, der in word/document.xml eingefügt werden muss, damit der Kommentar an einem bestimmten Text verankert ist – bis Sie diese Markierungen 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)