MS-Wordファイルからテキストを抽出し、当該テキストに何らかの処理(編集)を加えた後に、元のファイルにテキストを書き戻すための拡張です。Wordファイルをテキストエディタで編集したいときや何らかのバッチ処理を行いたいときなどに使うと便利だと思います。
バージョン:1.00
ダウンロード: worddoc.zip
利用条件:MS-Wordがインストールされている必要があります1。また、Tcl拡張のtDOMを利用していますので、tDOMがインストールされている必要があります。
使い方:利用できる関数は下記の4つです。詳しくは以下を参照下さい。
worddoc::extract wordfile ?destination?
wordfileからテキストを抽出し、テキストファイル(destination)に当該テキストを書き出します。destinationが指定されていない場合はwordfileの拡張子をtxtに置き換えたファイル名でwordfileと同じフォルダ下に出力します。対応しているWordのファイル形式はdoc, docx, xmlの3つです。処理が正常に終了すれば出力先のテキストファイル名が返り、処理に失敗した場合は何も返ってきません。
出力テキストは、MS-Wordのパラグラフごとに番号が振られされ、簡易マークアップによって書式などの情報を保持します。後述のworddoc::overwriteではこのパラグラフ番号とマークアップに基づいて、テキストの書き戻しを行います。
% package require worddoc 1.0 % worddoc::extract c:/test/test.docx c:/out/out.txt c:outout.txt |
worddoc::overwrite textFile originalFile ?destination?
worddoc::extractで出力したテキスト(textFile)をoriginalFileに書き戻します。destinationには出力ファイル名を指定し、指定されなかった場合はファイル名「originalFile-out.doc」でoriginalFileと同じフォルダ下に出力します。出力ファイルとして指定可能なファイル形式は、doc, docx, xml の3つです。
処理が正常に終了すれば出力先のテキストファイル名を返します。エラーが発生した場合は、ファイル名「originalFile.log」でエラーログを出力します。エラーログ行頭の「NUMBER」は、指定したテキストファイルとオリジナルのWordファイルのパラグラフ番号が一致していないことを示しています。テキストファイルを開き、「NUMBER」で指定された行のあたりを確認して下さい。パラグラフ番号が連続していない場合はそれを修正します。エラーログ行頭の「LINEHEAD」はテキストファイルの行頭に<nnn>形式のパラグラフ番号がないことを示しています。テキストファイルを開き、該当個所を修正して下さい。
% package require worddoc 1.0 % worddoc::overwrite c:/out/out.txt c:/test/test.docx c:/out/result.doc c:outresult.doc |
worddoc::changeFormat wordfile format ?destination?
wordfileを指定されたファイル形式(format)に変換し、destinationに出力します。formatには「doc, docx, xml」を指定することができます。destinationが指定されなかった場合はwordfileの拡張子をformatに置き換えてwordfileと同じフォルダ下に出力します。
% package require worddoc 1.0 % worddoc::changeFormat c:/test/test.docx xml c:/out/change.xml c:outchange.xml |
worddoc::getInstallationPath
Tcl拡張のregistryを利用し、MS-Wordのインストールパスを取得します。例えば次のようにMS-Wordを起動する場合などに利用します。
% set path [worddoc::getInstallationPath] C:PROGRA~2MIF5BA~1Office14WINWORD.EXE % exec $path c:/out/change.xml & |
出力例と簡易マークアップについて
上掲画像のWordファイル(リンク:Google docsで確認)からテキストを抽出した場合の出力例を示します。
<0>((bindata|img)) <1>((Office Open XML|b)) (((OpenXML|b)), ((OOXML|b)))とは、((Microsoft Office 2007|i))で新たに採用された文書フォーマット。((Word|u))((、|u))((Excel|u))((、|u))((PowerPoint|u))の保存形式として採用され、拡張子はdocx, xlsx, pptxとなる。OpenOffice.org 3.0も対応している。2006年12月にEcma InternationalによりECMA-376(([1]|cbody|0))((http://www.ecma-international.org/publications/standards/Ecma-376.htm|comment))として標準化され、2008年4月にはISOとIECの合同技術委員会((ISO/IEC JTC 1|fg|FF0000))の副委員会SC 34において、((ISO/IEC 29500|bg|yellow))として標準化された。 <2> <3>Microsoft Officeはデータを格納するにあたり独自のバイナリ形式を用いてきたが、バージョン12 (Office 2007)からは((従来形式|bg|red))に加えて、新たに((X|sub))M((L|sup))で記述された規格をデフォルトとして((採用|del|2))((採択|ins|3))した。((Office Open XMLはOffice 2007で新たに採用された規格をベースとしており、内容は公開されている。|fnote)) <4>((競合規格として「OpenDocument Format (ODF)」 (ISO/IEC 26300) がある。|tbx)) <5> <6> <7> <8>((Office Open XML - Wikipedia|u)) <9>http://ja.wikipedia.org/wiki/Office_Open_XML
書式情報を保持するための簡易マークアップは下表の通りです。
書式や要素 | 表記例 |
---|---|
太字 | ((太字|b)) |
斜体 | ((斜体|i)) |
下線 | ((下線|u)) |
文字色 | ((文字色|fg|FF0000)) |
背景色 | ((背景色|bg|yellow)) |
下付 | ((下付|sub)) |
上付 | ((上付|sup)) |
テキストボックス | ((テキストボックス|tbx)) |
脚注 | ((脚注|fnote)) |
コメント部分 | ((コメント部分|cbody|0)) |
コメント本文 | ((コメント本文|comment)) |
削除の変更履歴2 | ((削除|del|1)) |
挿入の変更履歴3 | ((挿入|ins|2)) |
画像 | ((bindata|img)) |
※現在のところ、フォントサイズの情報は保持されません。保持するとworddoc::extractで出力するテキストが括弧だらけになって可読性が大きく下がるためです。フォントサイズ以外の未対応の書式情報については、今後必要に応じて少しずつ対応していきたいと思います。
※worddoc::overwriteは、これらマークアップに基づいて書式情報などを復元します。太字や斜体などインラインの書式情報は削除しても問題ありませんが、テキストボックスやコメントなどを削除すると文書構造の整合性が失われる可能性があります。また、行頭のパラグラフ番号を消すとエラーが発生し、正しく処理することができません。
制限事項と内部処理
- 本拡張を使用する際は、MS-Wordを閉じて下さい。開いていると処理を行うことができません。
- ファイル形式の変換(worddoc::changeFormat)には、内部でVBScriptを使用しています。
- worddoc::extractで出力されるテキストファイルの文字コードはUTF-8です。worddoc::overwriteで読み込むことができるテキストファイルの文字コードもUTF-8です。worddoc::changeFormatではVBScriptを使用しているため、文字コードには[encoding system]の返り値が使われます。日本語Windowsであればcp932が使われるため、パスにUnicode文字が含まれていると正しく処理することができません。
- worddoc::extractもworddoc::overwriteも処理対象のWordファイルをいったんXML(WordML)に変換した上でテキストの抽出、書き戻しを行っています。処理対象としてWordMLのファイル(拡張子がxml)を与えると変換する手間が省けるため、より高速に処理を行うことができます。
- いずれの処理も出力ファイルと同名のファイルが存在している場合、無条件に上書きされます。確認は行いません。