Wordでコメントを非表示にしたり、変更履歴を表示しない設定にしたりすると、画面上はきれいな文書に見えます。
しかし、画面に表示されないことと、ファイルから情報が削除されたことは別です。
前回は"Wordのコメントを非表示にしても消えてない? 社外共有前に確認したい6つの情報" (https://qiita.com/kourak_utiloop/items/7541294d7fef3242821e) で、送付前の確認項目を整理しました。今回は一歩踏み込んで、".docx" ファイルの内部を見てみます。
- ".docx" の正体はZIP形式
現在のWordで一般的に使われる ".docx" は、Office Open XML(OOXML)形式のファイルです。中身は、複数のXMLなどをまとめたZIPパッケージになっています。
実際に確かめるのは簡単です。
- 自分で作成したテスト用の "sample.docx" を用意する
- ファイルをコピーし、コピーの拡張子を ".zip" に変更する
- ZIPファイルとして展開し、中を確認する
たとえば、次のようなファイルが見つかります(構成は文書によって異なります)。
sample.docx
├─ [Content_Types].xml
├─ _rels/
│ └─ .rels
├─ docProps/
│ └─ core.xml
└─ word/
├─ document.xml
├─ styles.xml
└─ comments.xml
"comments.xml" は、コメントがある文書などで使用されます。
ここで面白いのは、本文だけがWordファイルのすべてではないという点です。
- どんな情報がどこにある?
| 内部ファイル | 主な役割 |
|---|---|
| "word/document.xml" | 本文や、変更履歴に関するXML要素など |
| "word/comments.xml" | コメント情報(存在する場合) |
| "docProps/core.xml" | 作成者・最終更新者などの文書プロパティ |
| "word/_rels/document.xml.rels" | 本文から関連パーツへの参照関係 |
たとえば "docProps/core.xml" には、次のような要素が含まれる場合があります。
<dc:creator>Example User</dc:creator>
<cp:lastModifiedBy>Other Person</cp:lastModifiedBy>
※説明用の抜粋です。実際のXMLでは名前空間の定義なども含まれます。
作成者や最終更新者の名前は、印刷した紙面に出なくても、電子ファイルのプロパティとして残り得ます。
また、変更履歴を記録した文書では、"word/document.xml" に挿入・削除を示す <w:ins> や <w:del> といったXML要素が現れることがあります。
つまり、「変更履歴を表示しない」ことは「履歴を確定して削除する」ことと同義ではありません。
- Pythonで読み取り専用の簡易チェック
ZIP形式なので、Pythonの標準ライブラリだけでも内部ファイルの有無や、一部の変更履歴タグを確認できます。
from zipfile import ZipFile
from xml.etree import ElementTree as ET
W = "{http://schemas.openxmlformats.org/wordprocessingml/2006/main}"
with ZipFile("sample.docx") as z:
parts = set(z.namelist())
for part in (
"docProps/core.xml",
"word/comments.xml",
"word/document.xml",
):
print(f"{part}: {'あり' if part in parts else 'なし'}")
if "word/document.xml" in parts:
root = ET.fromstring(z.read("word/document.xml"))
print("挿入タグ:", len(root.findall(f".//{W}ins")))
print("削除タグ:", len(root.findall(f".//{W}del")))
このコードは "sample.docx" を読み取るだけで、元ファイルを変更しません。
ただし、これは内部構造を理解するための簡易チェックです。"comments.xml" が存在するだけで有効なコメントが残っているとは限らず、変更履歴も本文以外のパーツに含まれる場合があります。
「なし」「0件」と出ても、機密情報が完全に存在しないという保証にはなりません。
- 内部XMLを直接削除すればよい?
おすすめしません。
DOCXは単なるXMLファイルの寄せ集めではなく、パーツ同士が関連付けられた構造です。コメントのXMLだけ削除すると、参照関係が不整合になり、Wordで問題が起こる可能性があります。
共有前の整理には、まずWord標準の機能を使う方が安全です。
- 変更履歴:[校閲]で変更を確認し、必要に応じて承諾または元に戻す
- コメント:必要なコメントを削除する
- 隠れた情報:[ファイル]→[情報]→[問題のチェック]→[ドキュメント検査]で確認する
ドキュメント検査で削除する情報には元に戻せないものもあるため、元ファイルのコピーで作業してください。
- なぜブラウザだけでもDOCXを検査できるのか
DOCXがZIPとXMLで構成されているなら、専用のデスクトップソフトでなくても、構造を解析するプログラムを作れます。
この仕組みを利用すれば、ブラウザ上のJavaScriptでファイルを読み込み、内部パーツを調べることも可能です。処理をブラウザ内で完結させれば、検査対象の文書をサーバーに送信する必要もありません。
こうした考え方を取り入れたツールとして、"Word Finalizer" (https://word.utiloop.space/) を公開しています。業務用Wordファイルを共有する前に確認したいときの選択肢の一つです。
ただし、ツールを通したことだけで情報漏えいリスクがゼロになるわけではありません。本文や添付・埋め込み情報を含め、送付前の最終確認は必要です。
まとめ
".docx" をZIPとして開いてみると、Wordの「画面で見える文書」と「ファイルが保持している情報」の違いが理解しやすくなります。
情報の扱いで大事なのは、見えなくすることではなく、残すべき情報と削除すべき情報を区別すること。
Wordを社外に送る機会があるなら、一度はテスト用ファイルの内部構造をのぞいてみると、実務での確認ポイントが変わるかもしれません。
参考資料
- "Microsoft Learn: About the Open XML SDK for Office" (https://learn.microsoft.com/en-us/office/open-xml/about-the-open-xml-sdk)
- "Microsoft サポート: ドキュメント検査で非表示のデータと個人情報を削除する" (https://support.microsoft.com/ja-JP/Office/collab-files/remove-hidden-data-and-personal-information-by-inspecting-documents-presentations-or-workbooks)
- "Microsoft サポート: Wordで追跡された変更を承諾または拒否する" (https://support.microsoft.com/ja-jp/word/accept-or-reject-tracked-changes-in-word)