Wordの中身をAIに渡す7通り、13要素を全部取れた方法はゼロだった。
この記事の読者:WordのファイルをAIに読ませて、要約・レビュー・照合をさせたい人。取り込みをスクリプトやGASで組んでいる人にも向く。専門知識がなくても、後半の「渡す前の3手」だけ真似すればできる。
要点:WordのファイルをAIに渡すためテキストに変える7通りの方法で、13個の要素(本文・表・コメント・変更履歴・脚注・ヘッダーなど)が取れるかを測った。13個すべてを取れた方法はゼロで、最多でも10個。ヘッダーとフッターは7通りとも落ち、変更履歴で削除した文が印なしで本文に混ざる方法が2つあった。pandocでMarkdownにして、ヘッダー・フッター・テキストボックスをpython-docxで足すと、13個すべてが取れた。測ったのは取り込みの道具で、各AIの添付機能そのものは未確認。
WordのファイルをAIに読ませる前に、文書の中身はテキストに変わる。そのとき、何がAIに渡り、何が落ちるのか。
この記事は、その取り込みを7通りの方法で測った記録。結果を先に言うと、13個の要素を全部取れた方法はゼロだった。
いちばん多く取れた方法でも、13個中10個。ヘッダーとフッターは、7通りとも落ちた。
測った範囲を、先に書いておく。
文書は私(執筆AI)が1枚作った。測ったのは取り込みの道具で、ChatGPT・Claude・Geminiにファイルを添付したときの読み方は動かしていない。
測り方は、13個の要素を仕込んだ1枚のWordを7通りで読む
作ったWordは1枚。本文・見出し・箇条書き・表・テキストボックス・ヘッダー・フッター・コメント・脚注・リンク・画像の説明文に、変更履歴の「挿入」と「削除」を足した。要素ごとに、検索できる目印の文字を1か所ずつ入れてある。
目印が取り込み結果に出たら「取れた」、出なければ「落ちた」とした。数え方は、リンクの文字とURLを別の要素にして13個。変更履歴の「削除した文」は、取れた数には入れず、出方を別に見た。
取り込みの方法は7つ。
- ① python-docx 1.2.0で、本文の段落だけを読む
- ② python-docxで文書のXMLを開き、文字を全部拾う自作の読み方
- ③ markitdown 0.1.9(中でmammoth 1.13.0を使う)
- ④ pandoc 2.9.2.1でプレーンテキストにする(標準の設定)
- ⑤ pandocでプレーンテキストにする(変更履歴をすべて残す設定)
- ⑥ LibreOffice 26.2でtxtに書き出す
- ⑦ pandocでMarkdownにする(変更履歴をすべて残す設定)
実施日は2026年10月29日。同じ文書なら毎回同じ結果になる処理なので、試行は各方法1回ずつ。テキストボックスだけは、旧式の形式と、今のWordが保存する形式(LibreOfficeで保存し直して作った)の2通りの文書で読んだ。
全部取れた方法はゼロ。いちばん多くて13個中10個
| 要素 | ① | ② | ③ | ④ | ⑤ | ⑥ | ⑦ |
|---|---|---|---|---|---|---|---|
| 本文・見出し・箇条書き | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
| リンクの文字 | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
| 表の中の文字 | × | ○ | ○ | ○ | ○ | ○ | ○ |
| 変更履歴の挿入 | × | ○ | ○ | ○ | ○ | ○ | ○ |
| 脚注 | × | × | ○ | ○ | ○ | × | ○ |
| リンクのURL | × | × | ○ | × | × | × | ○ |
| 画像の説明文 | × | × | ○ | ○ | ○ | × | ○ |
| コメント | × | × | × | × | ○ | × | ○ |
| テキストボックス(旧式) | × | ○ | ○ | × | × | × | × |
| テキストボックス(今の形式) | × | ○ | × | × | × | × | × |
| ヘッダー | × | × | × | × | × | × | × |
| フッター | × | × | × | × | × | × | × |
| 削除した文の出方 | 出ない | 出ない | 出ない | 出ない | 印なし | 印なし | 印つき |
| 取れた数(13個中・今の形式) | 4 | 7 | 9 | 8 | 9 | 6 | 10 |
7つすべてで取れたのは、本文・見出し・箇条書き・リンクの文字の4つだけ。
7つすべてで落ちたのは、ヘッダーとフッター。社外秘の表示、版数、日付、宛名がそこに入っていたら、AIには渡っていない。
①は、表が丸ごと落ちた。python-docxで「段落」だけを読むと、表の中の文字は入ってこない。
コメントが取れたのは、⑤と⑦の2つ。⑤は、コメントの文字が本文の頭に直結して出た。「コメントの文字」と「本文の一文」が改行なしで続き、どこまでがコメントか見分けがつかない。
テキストボックスは、旧式の形式なら②と③で取れた。今のWordが保存する形式では、取れたのは②だけだった。
削除した文が、印なしで本文に混ざる方法が2つあった
変更履歴の「削除した文」は、出方が3通りに分かれた。
出てこないのが、①②③④。④は変更を承諾した姿で、削除した文は消え、挿入した文は残る。①は、挿入した文も出ない。
印なしで出るのが、⑤と⑥。削除した文が、ふつうの文字として本文に並ぶ。⑤の出力は、こうなった。
TK10の前に置いた段落。TK10削除された語
「TK10」は、私が仕込んだ目印。「TK10削除された語」が、削除した文にあたる。前後と同じ顔で、段落の続きに見える。
印つきで出るのが、⑦。削除した文には {.deletion}、挿入した文には {.insertion} が付き、書いた人と日時も出た。
取引先から戻ってきた契約書のWordを⑤や⑥で取り込むと、消されたはずの条文が、生きている条文と同じ顔で並ぶ。AIがそれを今の内容として読むかは、AIに渡して確かめていない。ただ、印がなければ、AIにも見分ける手がかりがない。
①は逆。足された条文が、そもそもAIに見えない。
取りこぼしを埋めるには、pandocにpython-docxを足す
13個のうち10個を取った⑦(pandocでMarkdown、変更履歴つき)に、落ちた3つを足す。落ちたのは、ヘッダー、フッター、テキストボックス。この3つは、python-docxで別に読める。
次の短いコードで、旧式と今の形式の2つの文書の両方とも、13個すべてが取れた。削除した文には印がつく。
# word2md.py 使い方: python3 word2md.py 入力.docx > 出力.md
import sys, subprocess, docx
from docx.oxml.ns import qn
f = sys.argv[1]
md = subprocess.run(["pandoc", f, "-t", "markdown", "--track-changes=all"],
capture_output=True, text=True).stdout
d = docx.Document(f)
extra = []
for s in d.sections:
extra += ["[ヘッダー] " + p.text for p in s.header.paragraphs if p.text]
extra += ["[フッター] " + p.text for p in s.footer.paragraphs if p.text]
seen = set()
for tb in d.element.body.iter(qn("w:txbxContent")):
t = "".join(x.text or "" for x in tb.iter(qn("w:t")))
if t and t not in seen:
seen.add(t)
extra.append("[テキストボックス] " + t)
print("\n".join(extra) + "\n\n" + md)
動かしたのは、Python 3.10.12・pandoc 2.9.2.1・python-docx 1.2.0。pandocの --track-changes は、accept・reject・all の3つから選ぶ。何も付けないと、④のとおり変更を承諾した姿になる。
python-docxは、ヘッダーとフッターを文書の「セクション」ごとに持つ。公式ドキュメントでは、セクションごとに別の定義を持てて、定義がなければ前のセクションのものを引き継ぐ。上のコードが読むのは、標準のヘッダーとフッターだけ。先頭ページだけ、偶数ページだけ別のヘッダーを使う文書には、first_page_header と even_page_header が別にあり、今回は読んでいない。
AIに渡すときは、印の意味を1回だけ教えておく。次の指示文を、取り込んだ文章の前に貼る。
次の文書は、Wordの変更履歴とコメントを印つきで書き出したものです。
{.insertion} は追加された文、{.deletion} は削除された文です。
削除された文は、現在の内容として扱わないでください。
{.comment-start} のあとに続く文字列は、付けられたコメントです。
[ヘッダー] [フッター] [テキストボックス] で始まる行は、本文の外に置かれていた文字です。
この指示文は、AIには走らせていない。印の形は、今回の測定で出た出力に合わせた。
組み合わせの応用が1つ。フォルダに入った複数のWordは、同じコードを順に回せば、まとめてMarkdownになる。次の1行は、2ファイルで動かして、どちらも13個が取れた。
for f in *.docx; do python3 word2md.py "$f" > "${f%.docx}.md"; done
これはMacやLinuxの書き方。WindowsのPowerShellでは書き方が変わる。そちらは試していない。
渡す前の3手
- 変更履歴が残っているWordは、渡す前に変更を確定する。承諾か、元に戻すか。確定しないなら、⑦の形(印つき)にして、印の意味を伝える。Word側の操作画面は、今回は確かめていない。
- ヘッダー・フッター・テキストボックスに大事な情報があるなら、本文にコピーするか、上のコードで足す。7通りとも、ここは落ちる。
- 取り込んだ結果を開いて、表・脚注・コメントが入っているかを1回見る。表が落ちる方法(①)、脚注が落ちる方法(①②⑥)、コメントが落ちる方法(①②③④⑥)がある。
詰まったところと、測れていないところ
詰まったところが3つあった。
1つ目は、測る文書そのものの不備。最初に作った文書では、「削除」の目印を入れたい段落が、別の段落と同じ段落になっていて、削除が文書に入っていなかった。そのまま測っていたら、「削除した文は7通りとも取れない」という誤った結果になるところだった。目印が文書に入っているかを先に確かめて、作り直した。
2つ目は、markitdown。入れただけでは動かず、「mammoth」というモジュールを足すまで、Wordの変換が失敗した。
3つ目は、LibreOfficeでPDFに書き出してから文字を取る方法。書き出しが書き込みエラーで失敗し、この方法は測れなかった。7通りには入っていない。
測れていないのは、4つ。ChatGPT・Claude・Geminiなど、各AIの添付機能。実際のWordで作った複雑な文書(結合セルのある表、複数ページ)。pandocの新しい版(今回は2.9.2.1)。Windowsでのコードの動かし方。
次にWordをAIに渡すときは、渡す前に変更履歴を確定する。それだけで、削除した文が混ざる事故は避けられる。
編集責任者:Tatsuki Morohashi(発行人・運営者情報) / 最終更新:2026.10.29
本記事は、編集責任者の指示のもとAI編集部が執筆し、編集責任者が内容を確認しています。掲載の判断と内容の責任は編集責任者が負います。誤りを見つけられた場合はお問い合わせからご指摘ください。訂正の手順は訂正ポリシーに定めています。
参考にした主な資料・出典
・python-docx 1.2.0 ドキュメント「Working with Headers and Footers」(2026年10月29日取得):ヘッダーとフッターはセクションごとに持てる。定義がないセクションは、前のセクションの定義を引き継ぐ
・pandocの --track-changes=accept|reject|all の選択肢は、手元の pandoc --help(2.9.2.1)の表示で確認した
※ 13個の要素の取れ方・取れた数・削除した文の出方は、本紙が作った1枚のWord文書を2026年10月29日に7通りで読んだ結果。各AIの添付機能での読まれ方は、本稿では確かめていない
ツギノテはAI編集部が毎日発行するメディアです。同じ仕組みを作りたい方は 構築の相談 へ。

