【Word】テキストを抽出する4つの方法

翻訳をしていると、Officeファイルから文字を抽出したくなることがよくあります。

なかでも、頻度が最も高いのがMS Wordです。

この記事では、Wordから文字を抽出する方法について、

  • CATOVIS Office を使う方法
  • CATOVIS Office CLI(Node.js/JavaScript)を使う方法
  • PowerShellを使う方法
  • unoconv を使う方法

の4つに分けて解説したいと思います。

CATOVIS Office を使う方法

おそらくこれが最も簡単だと思います。

このサイトで運用しているしている CATOVIS Office を使えば、直感的な操作でテキストを抽出することができます。マニュアルはこちら

テキスト抽出を選択し、

「原文ファイル」とあるブロック内にWordファイルをドロップし、実行ボタンを押すだけです。

私は対訳などの処理をすることが多い都合上、「区切り記号の挿入」と「セグメンテーション」にチェックを入れていますが、
純粋にテキストが抽出したい場合はいずれもチェックを外してしまってもいいと思います。

抽出が終われば、テキストファイル(.txt)としてダウンロードできます。

PWAにも対応していますので、ChromeやEdgeであれば、URLバーの右の方にあるボタンでインストールしておくこともできます。

注意点としては、.doc などの古いフォーマットには対応していないことと、
ブラウザを利用している都合上、あまりに大きいファイルだと「応答なし」として固まってしまうケースがあること。

後者は通常であれば、5~10分ほど「待機」すれば問題なく処理できることがほとんどですが、
その間はブラウザの動きが遅くなりがちです。

もしどうしても抽出できない場合は、他の方法も試してみてください。

CATOVIS Office CLI(Node.js/JavaScript)を使う方法

これは CATOVIS Office の開発の基礎となっている、CATOVIS Office CLI を直接使用する方法です。

CATOVIS Officeは、バックグラウンドにNode.jsを使用しており、抽出の処理自体はJavaScriptで構成されています。

CLIを直接使用するには、プログラミング言語の Node.js が必要になるため、敷居はやや高くなってしまいますが、
CATOVIS Office を使用するのと比べて、「長時間の処理でも止まらないこと」や「設定を保存しやすいこと」がメリットとして挙げられます。

また実は私の実装自体が、CLIを先に作り、そのためのGUIとしてWebアプリを製作する、という順序であるため、
CLIの方が処理内容が充実していることが多いです。
※例えば、2021年4月12日現在、CLIにはTMX/TBX/XLIFF の抽出・更新処理を組み込んでいますが、CATOVIS Officeではまだ使えるようになっていません。

詳しい使い方は Github のREADMEに記載していますので、使ってみたい方はぜひ挑戦してみてください。

なお、コード自体はMITライセンスとしていますので、改変等は自由にしていただいて結構です。

PowerShellを使う方法

上記の2つはいずれもJavaScriptを使う方法で、docxにしか対応していませんでした。

じゃあ抽出したいファイルのほとんどが古い doc形式だった場合はどうしようか、となりますよね。

もちろん、フォーマットを変換してから抽出してもよいのですが、やや面倒ですよね。

その場合は、Microsoft謹製でWindowsに標準搭載されているPowerShellを使うのも一考です。

以下のように、COMオブジェクトとしてWordオブジェクトを作ることで、ほとんどの文字列にアクセスすることができます。

$files = Get-ChildItem .\src/ | Where-Object { $_.Name -match '.docx?$' }
$wd = New-Object -ComObject "Word.Application"

$tableEnd = -join [char]7
foreach ($file in $files) {
    $resultFile = "./output/" + $file.baseName + ".txt"
    $doc = $wd.Documents.open($file.FullName)
    $name = $file.Name
    
    $pNum = $pghs.count
    $pictNum = 0
    
    New-Item $resultFile
    
    $textInRng = $doc.Range().text.replace($tableEnd, "")
    
    $shps = $doc.Shapes
    $sNum = $shps.count
    $textInS = @()
    foreach ($shp in $shps) {
        if ($shp.Type -eq 13) {
           $pictNum++
           continue
        }
        if ($shp.TextFrame.HasText -eq -1) {
            $textInS += $shp.TextFrame.textRange.text
        }
        if ($shp.GroupItems.count -gt 0) {
            $gItems = $shp.GroupItems
            foreach ($gItem in $gItems) {
                if ($gItem.Type -eq 13) {
                   $pictNum++
                   continue
                }
                if ($gItem.TextFrame.HasText -eq "-1") {
                    $textInS += $gItem.TextFrame.textRange.text
                }
            }
        }
    }
    
    $stexts = $textInS -join "`n"
    Write-Output "---" | Add-content $resultFile -Encoding UTF8 
    Write-Output "FILE NAME: ${name}" | Add-content $resultFile -Encoding UTF8 
    Write-Output "PARAGRAPHS: ${pNum}" | Add-content $resultFile -Encoding UTF8 
    Write-Output "SHAPES: ${sNum}" | Add-content $resultFile -Encoding UTF8 
    Write-Output "GRAPHICS: ${pictNum}" | Add-content $resultFile -Encoding UTF8
    Write-Output "---" | Add-content $resultFile -Encoding UTF8
    Write-Output $textInRng | Add-content $resultFile -Encoding UTF8
    Write-Output $stexts | Add-content $resultFile -Encoding UTF8
    $doc.Close()
}

$wd.Quit()
$wd = $null

[System.GC]::Collect()

VBAと同じように、Paragraphs、Tables、Shapesのコレクションにアクセスしていくため、段落と表やテキストボックスの順序を保つことは難しいですが、
docファイルとdocxファイルが混在している場合に、特に有効です。

またPowershellしか使用していないことから、完全オフラインでも実行することができます。
(CATOVIS Office/CATOVIS Office CLIも事前にインストールまたはクローンしていれば、オフラインで実行できますが)

ただし、注意点としてはCOMオブジェクトを作るため、パソコンにWordがインストールされている必要があること。

また、内部的にWordファイルを開いているため、CATOVIS Officeと比べて速度的には遅く、実行中は他のWordファイルを使用することができません。

しかしそれでも、Wordの使える環境であれば、非常に便利であることは間違いないでしょう。

unoconv を使う方法

LinuxかWSLが使用できる場合は、unoconvを使うのも楽ですね。

unoconvはLibreOfficeを利用して処理をするため、Word本体が不要です(もっとも、LinuxにMS Wordはインストールできませんが)。

初回のインストール時に、なかなか多量のパッケージがインストールされますので、
使う可能性のあるパソコンには、あらかじめインストールしておきましょう。

以下、unoconvを使ったサンプルコードです。

# インストールがまだであればしておく
sudo apt-get install unoconv

# 変換の実行
# -fの後ろに変換後のフォーマット、その後に入力ファイルパス
unoconv -f txt *.doc*

unoconvを使うメリットとして、一番大きいのはMS Officeが不要なこと。

上のサンプルコードで、*.doc* と指定していることからも分かるように、.docフォーマットにも対応しています。

さらに出力するフォーマットが豊富なのもポイント高いですね。

-fで指定するフォーマットには、PDFやHTML、RTFなども選べるようです。

一方でファイル数が多いときは時間がかかるので、根気も必要です

終わりに

ここまで4つの方法を紹介しました。

使い分けは次の通りです。

方法ポイント注意点
CATOVIS OfficeGUIがあり、直感的に操作可能
必要なxmlのみを読み取るため、高速
PWAとしてインストールすれば、オフラインで動作
docファイル未対応
大きいファイルの場合、ブラウザが遅くなる可能性も
CATOVIS Office CLI
(Node.js/JavaScript)
CUIでCATOVIS Officeと同じ処理が可能
一部の機能はCATOVIS Officeより充実している
必要なモジュールをインストールしておけば、オフラインで動作
docファイル未対応
Node.jsをインストールしておく必要がある
PowerShellWindows標準搭載の機能なので、インストール不要
MS製品同士で相性も〇
doc形式にも対応している
パソコンにMS Wordがインストールされている必要がある
unoconvdoc形式にも対応しており、MS Office不要
txt以外の形式(HTML、PDF、RTFなど)にもエクスポート可能
Linux/WSLが必要
Libreofficeがインストールされている必要がある

私としてはもちろん、CATOVIS Office/CATOVIS Office CLI をお勧めしますが、開発中のツールなのでまだバグがあることも。

その場合は枯れたツールとして、下の二つも候補に入れておいてください。

これからも CATOVISをよろしくお願いいたします。

CATOVIS LS

MS Office Wordと接続。軽量型でWYSIWYGを実現