DOCX-Erstellung, -Bearbeitung und -Analyse
Eine .docx-Datei ist ein ZIP-Archiv von XML-Dateien. Wählen Sie Ihren Ansatz basierend auf der Aufgabe:
| Aufgabe | Ansatz |
|---|---|
| Erstellen eines neuen Dokuments | Ein docx (npm)-Skript schreiben – siehe Fallstricke unten |
| Bearbeiten eines vorhandenen Dokuments | unzip → word/document.xml bearbeiten → zip (docx-js kann keine vorhandenen Dateien öffnen) |
| Lesen von Inhalt | pandoc -t markdown file.docx |
Skriptpfade unten sind relativ zum Verzeichnis dieser Fähigkeit.
Erstellen mit docx-js – Fallstricke
docx ist vorinstalliert – führen Sie nicht zuerst 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; dies 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 Hochformatmaße und
orientation: PageOrientation.LANDSCAPE– docx-js vertauscht Breite/Höhe intern. - Tabellen benötigen doppelte Breiten: setzen Sie
columnWidthsauf der Tabelle UNDwidthauf jeder Zelle, beide inWidthType.DXA(PERCENTAGE bricht in Google Docs). Spaltenbreiten müssen sich zur Tabellenbreite summieren. - Tabellen-Schattierung: verwenden Sie
ShadingType.CLEAR, niemalsSOLID(ergibt schwarz). - Listen: niemals
•wörtlich einfügen; verwenden Sie einenumbering-Konfiguration mitLevelFormat.BULLET. ImageRunerforderttype:("png","jpg", …).PageBreakmuss in einemParagraphsein.- Niemals
\nverwenden – verwenden Sie separateParagraph-Elemente. - Inhaltsverzeichnis: Überschriften müssen integrierte
HeadingLevel.*verwenden; benutzerdefinierte Überschriftenstile benötigenoutlineLevel, sonst werden sie nicht angezeigt. - Keine Tabelle als horizontale Linie verwenden – stattdessen einen unteren Absatzrand verwenden.
- Punktführer / rechtsbündig in derselben Zeile: verwenden Sie
PositionalTab(alignment: PositionalTabAlignment.RIGHT,leader: PositionalTabLeader.DOT) innerhalb einesTextRun, nicht wörtliche.oder Leerraum-Padding.
Ausgabe überprüfen
Nach dem Schreiben einer .docx-Datei rendern Sie sie und betrachten Sie sie:
python scripts/office/soffice.py --headless --convert-to pdf output.docx
pdftoppm -jpeg -r 100 output.pdf page
ls page-*.jpg # dann die Bilder lesen
pdftoppm füllt Seitennummern mit Nullen auf die Breite der Seitenanzahl auf (page-01.jpg…page-12.jpg).
Vorhandene Dokumente bearbeiten
Legacy .doc-Dateien müssen zuerst konvertiert werden: python scripts/office/soffice.py --headless --convert-to docx file.doc.
unzip -q doc.docx -d unpacked/
find unpacked -type l -delete # Symlink-Einträge entfernen – docx von externen Parteien ist nicht vertrauenswürdig
python scripts/merge_runs.py unpacked/ # fragmentierte Läufe zusammenführen, damit Text auffindbar ist
# unpacked/word/document.xml direkt bearbeiten – NICHT neu formatieren oder pretty-printen
(cd unpacked && 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
# Änderungsverfolgung? --author "<der Name, unter dem Sie Änderungen vorgenommen haben>" hinzufügen, um zu prüfen, ob jede Bearbeitung nachverfolgt ist
Word teilt Text über viele <w:r>-Läufe auf (Revisions-IDs, Rechtschreibprüfungsmarkierungen), sodass eine im Dokument sichtbare Phrase oft nicht als zusammenhängende Zeichenkette im XML existiert. 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-Datei direkt (python scripts/merge_runs.py doc.docx -o merged.docx).
Änderungsverfolgung: Wenn Sie Änderungen verfolgen, validieren Sie mit --author "<der Name, unter dem Sie Änderungen vorgenommen haben>" (erfordert --original) – es meldet jeden von Ihnen geänderten Text ohne umschließendes <w:ins>/<w:del>, was leicht versehentlich passiert und in der akzeptierten Ansicht unsichtbar ist. Wickeln Sie Läufe in <w:ins>/<w:del> mit w:id-, w:author- und w:date-Attributen ein. Innerhalb von <w:del> ist 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“ – das vollständige Löschen eines Absatzes ist also dies plus ein <w:del> um jeden Lauf. Das <w:del/> muss vor den anderen Kindern von rPr kommen; ihre Reihenfolge ist schemaabhängig.
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 Läufe alle gelöscht sind, verschwindet. Word tut dies; accept_changes.py und pandoc --track-changes=accept tun es nicht immer. Beide versagen auf die gleiche Weise – sie entfernen den gelöschten Text, lassen aber den leeren Absatz zurück, der wie ein falscher leerer Aufzählungspunkt wirkt, wenn er automatisch nummeriert war:
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 beiden Ansichten ist ein Artefakt dieser Ansicht, kein Fehler im Dokument. Überprüfen Sie Absatzlöschungen im XML.
Kommentare
Kommentare erfordern sechs verknüpfte Dateien. Verwenden Sie den Helfer – Verzeichnismodus, wenn Sie auch document.xml bearbeiten (spart einen Unzip/Rezip-Zyklus), .docx-Direktmodus sonst:
# Gegen ein bereits entpacktes Verzeichnis (bevorzugt, wenn auch Markierungen platziert werden)
python scripts/comment.py unpacked/ "Gebühren- & Ausgabenobergrenze ist zu niedrig"
python scripts/comment.py unpacked/ "Einverstanden" --parent 0
# Gegen eine .docx direkt
python scripts/comment.py contract.docx "Diese Obergrenze ist zu niedrig" -o annotated.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 das <w:commentRangeStart>/<w:commentRangeEnd>/<w:commentReference>-Snippet aus, das zu word/document.xml hinzugefügt werden muss, damit der Kommentar an bestimmtem 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)
Diese Fähigkeit wurde von Anthropic erstellt und wird von ihr gepflegt. Hier unverändert vendoriert, mit Ausnahme der Frontmatter-Metadaten; siehe LICENSE.txt für Bedingungen.