DOCXの作成、編集、および分析
概要
ユーザーから.docxファイルの作成、編集、または内容の分析を依頼されることがあります。.docxファイルは基本的にZIPアーカイブであり、XMLファイルやその他のリソースが含まれているため、読み取りや編集が可能です。タスクに応じて、さまざまなツールとワークフローが用意されています。
ワークフロー決定木
読み取り/分析
以下の「テキスト抽出」または「生XMLアクセス」のセクションを使用します。
新規文書作成
「新しいWord文書の作成」ワークフローを使用します。
既存文書の編集
-
自分が作成した文書 + 簡単な変更 「基本OOXML編集」ワークフローを使用します。
-
他者が作成した文書 **「Redliningワークフロー」**を使用します(推奨デフォルト)。
-
法律、学術、ビジネス、政府系文書 **「Redliningワークフロー」**を使用します(必須)。
内容の読み取りと分析
テキスト抽出
文書のテキスト内容を読むだけであれば、pandocを使用して文書をマークダウンに変換します。Pandocは文書構造を保持し、変更履歴を表示するのに優れています。
# 文書を変更履歴付きでマークダウンに変換
pandoc --track-changes=all path-to-file.docx -o output.md
# オプション: --track-changes=accept/reject/all
生XMLアクセス
コメント、複雑な書式、文書構造、埋め込みメディア、メタデータにアクセスするには、生XMLへのアクセスが必要です。これらの機能には、文書を解凍し、生のXMLコンテンツを読み取る必要があります。
ファイルの解凍
python ooxml/scripts/unpack.py <office_file> <output_directory>
主要なファイル構造
word/document.xml- 文書の本文word/comments.xml- document.xmlで参照されるコメントword/media/- 埋め込まれた画像やメディアファイル- 変更履歴は
<w:ins>(挿入)タグと<w:del>(削除)タグを使用します。
新しいWord文書の作成
新しいWord文書をゼロから作成する場合は、docx-jsを使用します。これにより、JavaScript/TypeScriptを使用してWord文書を作成できます。
ワークフロー
- 必須 - ファイル全体を読む:
docx-js.md(約500行)を最初から最後まで完全に読んでください。このファイルを読む際は、範囲制限を設定しないでください。 詳細な構文、重要な書式ルール、ベストプラクティスについては、文書作成を進める前にファイルの全文を読んでください。 - Document、Paragraph、TextRunコンポーネントを使用してJavaScript/TypeScriptファイルを作成します(すべての依存関係がインストールされていることを前提としますが、インストールされていない場合は以下の依存関係のセクションを参照してください)。
- Packer.toBuffer()を使用して.docxとしてエクスポートします。
既存のWord文書の編集
既存のWord文書を編集する場合は、Documentライブラリ(OOXML操作用のPythonライブラリ)を使用します。このライブラリはインフラストラクチャのセットアップを自動的に処理し、文書操作用のメソッドを提供します。複雑なシナリオでは、ライブラリを介して基盤となるDOMに直接アクセスできます。
ワークフロー
- 必須 - ファイル全体を読む:
ooxml.md(約600行)を最初から最後まで完全に読んでください。このファイルを読む際は、範囲制限を設定しないでください。 DocumentライブラリAPIと、文書ファイルを直接編集するためのXMLパターンについては、ファイルの全文を読んでください。 - 文書を解凍します:
python ooxml/scripts/unpack.py <office_file> <output_directory> - Documentライブラリを使用してPythonスクリプトを作成し実行します(ooxml.mdの「Documentライブラリ」セクションを参照)。
- 最終文書をパックします:
python ooxml/scripts/pack.py <input_directory> <office_file>
Documentライブラリは、一般的な操作のための高レベルメソッドと、複雑なシナリオのための直接DOMアクセスの両方を提供します。
文書レビューのためのRedliningワークフロー
このワークフローでは、OOXMLで実装する前に、マークダウンを使用して包括的な変更履歴を計画できます。重要: 完全な変更履歴を実現するには、すべての変更を体系的に実装する必要があります。
バッチ戦略: 関連する変更を3〜10件のバッチにグループ化します。これにより、デバッグが管理しやすくなり、効率が維持されます。各バッチを次のバッチに進む前にテストします。
原則: 最小限で正確な編集
変更履歴を実装する際は、実際に変更されるテキストのみをマークします。変更されていないテキストを繰り返すと、編集のレビューが難しくなり、プロフェッショナルでない印象を与えます。置換は、[変更なし] + [削除] + [挿入] + [変更なし] に分割します。変更なしのテキストについては、元のランからRSIDを抽出して再利用することで、元の<w:r>要素を保持します。
例 - 文中の「30日」を「60日」に変更する場合:
# 悪い例 - 文全体を置換
'<w:del><w:r><w:delText>期間は30日です。</w:delText></w:r></w:del><w:ins><w:r><w:t>期間は60日です。</w:t></w:r></w:ins>'
# 良い例 - 変更部分のみをマークし、変更なしのテキストは元の<w:r>を保持
'<w:r w:rsidR="00AB12CD"><w:t>期間は</w:t></w:r><w:del><w:r><w:delText>30</w:delText></w:r></w:del><w:ins><w:r><w:t>60</w:t></w:r></w:ins><w:r w:rsidR="00AB12CD"><w:t>日です。</w:t></w:r>'
変更履歴ワークフロー
-
マークダウン表現を取得する: 変更履歴を保持したまま文書をマークダウンに変換します:
pandoc --track-changes=all path-to-file.docx -o current.md -
変更を特定してグループ化する: 文書を確認し、必要な変更をすべて特定し、論理的なバッチに整理します:
位置特定方法(XML内の変更箇所を見つけるため):
- セクション/見出し番号(例:「セクション3.2」、「第IV条」)
- 段落識別子(番号が付いている場合)
- 周囲のテキストが一意のgrepパターン
- 文書構造(例:「最初の段落」、「署名欄」)
- マークダウンの行番号は使用しないでください。XML構造に対応しません。
バッチ整理(1バッチあたり3〜10件の関連変更をグループ化):
- セクション別: 「バッチ1: セクション2の修正」、「バッチ2: セクション5の更新」
- 種類別: 「バッチ1: 日付修正」、「バッチ2: 当事者名変更」
- 複雑度別: 単純なテキスト置換から始め、複雑な構造変更に取り組みます。
- 順次: 「バッチ1: 1〜3ページ」、「バッチ2: 4〜6ページ」
-
ドキュメンテーションを読み、解凍する:
- 必須 - ファイル全体を読む:
ooxml.md(約600行)を最初から最後まで完全に読んでください。範囲制限を設定しないでください。 「Documentライブラリ」と「変更履歴パターン」のセクションに特に注意してください。 - 文書を解凍する:
python ooxml/scripts/unpack.py <file.docx> <dir> - 推奨RSIDに注意する: 解凍スクリプトは、変更履歴に使用するRSIDを推奨します。このRSIDをコピーしてステップ4bで使用します。
- 必須 - ファイル全体を読む:
-
変更をバッチで実装する: 変更を論理的に(セクション、種類、または近接性ごとに)グループ化し、単一のスクリプトでまとめて実装します。このアプローチにより:
- デバッグが容易になります(バッチが小さいほどエラーの特定が簡単)。
- 段階的な進捗が可能になります。
- 効率が維持されます(バッチサイズ3〜10件が効果的です)。
推奨バッチグループ化:
- 文書セクション別(例:「セクション3の変更」、「定義」、「終了条項」)
- 変更種類別(例:「日付変更」、「当事者名更新」、「法的用語置換」)
- 近接性別(例:「1〜3ページの変更」、「文書前半の変更」)
各関連変更のバッチについて:
a. テキストをXMLにマッピングする:
word/document.xml内のテキストをgrepして、テキストが<w:r>要素間でどのように分割されているかを確認します。b. スクリプトを作成して実行する:
get_nodeを使用してノードを見つけ、変更を実装してからdoc.save()を実行します。パターンについては、ooxml.mdの**「Documentライブラリ」**セクションを参照してください。注: スクリプトを作成する直前に常に
word/document.xmlをgrepして、現在の行番号を取得し、テキストの内容を確認してください。行番号はスクリプトを実行するたびに変わります。 -
文書をパックする: すべてのバッチが完了したら、解凍したディレクトリを.docxに戻します:
python ooxml/scripts/pack.py unpacked reviewed-document.docx -
最終確認: 完成した文書の包括的なチェックを行います:
- 最終文書をマークダウンに変換:
pandoc --track-changes=all reviewed-document.docx -o verification.md - すべての変更が正しく適用されたことを確認:
grep "元のフレーズ" verification.md # 見つからないはず grep "置換後のフレーズ" verification.md # 見つかるはず - 意図しない変更が導入されていないことを確認します。
- 最終文書をマークダウンに変換:
文書の画像への変換
Word文書を視覚的に分析するには、2段階のプロセスで画像に変換します:
-
DOCXをPDFに変換:
soffice --headless --convert-to pdf document.docx -
PDFページをJPEG画像に変換:
pdftoppm -jpeg -r 150 document.pdf pageこれにより、
page-1.jpg、page-2.jpgなどのファイルが作成されます。
オプション:
-r 150: 解像度を150 DPIに設定(品質とサイズのバランスを調整)。-jpeg: 出力形式をJPEGに指定(必要に応じて-pngでPNGを使用)。-f N: 変換を開始する最初のページ(例:-f 2で2ページ目から開始)。-l N: 変換を終了する最後のページ(例:-l 5で5ページ目で停止)。page: 出力ファイルのプレフィックス。
特定の範囲の例:
pdftoppm -jpeg -r 150 -f 2 -l 5 document.pdf page # 2〜5ページのみを変換
コードスタイルガイドライン
重要: DOCX操作用のコードを生成する場合:
- 簡潔なコードを記述してください。
- 冗長な変数名や不必要な操作を避けてください。
- 不要なprint文を避けてください。
依存関係
必要な依存関係(利用できない場合はインストール):
- pandoc:
sudo apt-get install pandoc(テキスト抽出用) - docx:
npm install -g docx(新規文書作成用) - LibreOffice:
sudo apt-get install libreoffice(PDF変換用) - Poppler:
sudo apt-get install poppler-utils(pdftoppmを使用してPDFを画像に変換するため) - defusedxml:
pip install defusedxml(安全なXML解析用)