Python で Microsoft Word の脚注テキスト情報を抽出する

1 min読了の目安(約1400字TECH技術記事

前回 の記事の内容を応用して、開いている Microsoft Word 文書から脚注のテキスト情報を一括で抜き出してみます。

コード

標準出力でテキスト情報をやり取りするとエスケープ文字や空白の処理、文字コードの処理などが煩雑になるのでファイルに書き出す方式を採用しました。 Python で辞書型のリストとして書き出すと JSON に近くなるので取り回しに便利です。

コマンドライン引数の処理には pip で入手できる fire がとても便利です。

import win32com.client
import fire

def main(out_path):
    wdApp = win32com.client.Dispatch("Word.Application")
    if wdApp.Documents.Count < 1:
        if not wdApp.Visible:
            wdApp.Quit()
        return

    doc = wdApp.ActiveDocument
    note_list = []
    for nt in doc.FootNotes:
        note_list.append({"Id": nt.Index, "Note": nt.Range.Text})

    with open(out_path, mode = "w", encoding = "utf-8") as output_file:
        output_file.write(str(note_list))

if __name__ == "__main__":
    fire.Fire(main)

呼び出し側の PowerShell コマンドレット

普段は PowerShell がメインなので呼び出し用のコマンドレットも書いています。

こういうときに一時ファイルを作ってくれる New-TemporaryFile が便利です。

function Get-NotationTextOnActiveWordDocumentWithPython {
    if ((Get-Process | Where-Object ProcessName -EQ "winword").Count -lt 1) {
        return
    }
    $tmp = New-TemporaryFile
    $pyCodePath = "(ファイルへのパスを指定)"
    'python -B "{0}" "{1}"' -f $pyCodePath, $tmp.FullName | Invoke-Expression
    $result = Get-Content -Path $tmp.FullName -Encoding utf8NoBOM
    Remove-Item -Path $tmp.FullName
    return $($result | ConvertFrom-Json)
}

脚注を章末注に変換するような仕事で使えるかもしれません。