2011年12月21日水曜日

ターミナルでwordファイルを読みたい

1. 前置き
FreeBSDで暮らしているところに、WordやExcelの事務書類がメールの添付ファイルで届くことがよくある。
しかし、OpenOfficeを立ち上げるのも面倒で、lessと同じくらいの気楽さで読めればいいと思っていた。

数ヶ月前に、lessdocというshellscript を書いて(私の過去の記事「wordファイル(.docファイル)をtxtに変換する方法 -> wvWare」http://quantum-public-diary.blogspot.com/2011/08/worddoctxt-wvware.html)、Wordファイルはターミナルで内容確認できるようにした。
それを拡張して、Excelファイルにも対応したので、ここに報告する。

2. install しておくべきもの
(1) textproc/wv
word形式のファイルをhtml形式やpdf形式などに変換するライブラリ。本家はこちらhttp://wvware.sourceforge.net/。portsから入れればよい。
(2) textproc/xlhtml
excel形式のファイルをhtml形式に変換するプログラム。本家はこちらhttp://chicago.sourceforge.net/xlhtml/。portsから入れればよい。
(3) japanese/w3m-img
コンソール(ターミナル)用のWeb browser。ここではhtml->txt変換に使う。軽いので普段もssh越しにブラウザを使いたいときなどに利用している。それから、うっかりXorgを壊してしまったときに、kon(japanese/kon2-16bit)と組み合わせて、最後のとりでとして検索するのに使う。
www/w3m-imgを入れてしまうと、文字エンコーディングなどのオプションが少なくて、日本語を使うときに困ると思う。
(4) 日本語を表示できるターミナル
私は gnome-terminal派だが、ktermでももちろんよい。lvの-Oオプションと、ターミナルの入力エンコーディングを合わせないと文字化けする。

3.原理
やることは、wvWareでhoge.docをhoge.htmlに変換し、w3mのdump機能を利用してtxtにし、lvでターミナルに表示する。

script はこれだ!!!

#!/bin/sh
# lessoffice.sh
export LV=-Ojis; 
for i; do
    TMPDIR=`mktemp -d /tmp/tmp_lessdocXXXX` || exit 1 
# for Word 
#    if file $i |grep Word; then
    if [ ${i##*.} = doc ]; then
        if ! wvHtml $i $TMPDIR/tmp.html; then
            echo "You need to install textproc/wv !!!"
        else
            w3m -dump $TMPDIR/tmp.html |lv 
        fi
# for Excel
#    elif file $i |grep Excel; then
    elif [ ${i##*.} = xls ]; then
        if ! xlhtml $i > $TMPDIR/tmp.html; then
            echo "You need to install textproc/xlhtml !!!"
        else
            w3m -dump $TMPDIR/tmp.html |lv 
        fi
# for other format
    else
        lv $i;
    fi
#  else
    rm -r $TMPDIR;
done
4.いいところ
(1) lvのincremental searchを使ったり、grep に流し込んだりできる。
(2) Xがいらない。ssh先で実行するときに、とくに快適。

5.追記
ファイルの種類の識別をファイル名に頼っているのは格好悪いのだけれど、file(1) を使うと、word(excel)のバージョンによっては、識別に失敗するので、この方法にしている。