ワード、エクセル、PDFなどのファイルをテキスト形式として書き出す

ワード、エクセル、PDFなどのファイルをテキスト形式として書き出す

経緯

Microsoft Wordのファイル(doc/docx)やopendocument(odt)、 PDFファイルの内容を確認する際に、これらのアプリケーションを開かなくてもすむようにテキスト形式に変換してくれるアプリケーションがあります(antiword, pandoc, pdftotext)。

ただし、

  • doc形式のファイルはantiword
  • docx形式のファイルはpandoc
  • pdfファイルはpdftotext

のようにすべてアプリケーションが異なり、しかも使用オプションも異なります。

そこでこれらのコマンドを1つにまとめてみました。

同時にMicrosoft Excelのファイル(xls/xlsx)やopendocument(ods)もテキスト形式に変更できるようにしてみました。

内容

必要なアプリケーション

  • antiword (doc)
  • pandoc (docx, odt, html)
  • pdftotext (pdf)
  • gnumeric (xls, xlsx, ods => html)
  • w3m (xls, xlsx, ods)

上2つのアプリケーションについては Vine Linux用のrpmパッケージを自分自身で作成してアップロードしています。

シェルスクリプト

GitHub で公開しています。

基本的にファイルの拡張子で分岐し、標準出力に出力するようにしているだけです。

新たなファイルに保存するのは使い勝手が悪いと感じたため標準出力に表示するようにしています。

#!/bin/sh
# require pdftotext (pdf)
# require antiword (doc)
# require pandoc (docx/odt/html/tex)
# require gnumeric and w3m (xls/xlsx)

set -e

if [ $# -eq 0 ]; then
  echo "Need argument(s): pdf, doc(x), xls(x) or ... file(s)" 1>&2
  exit 1
fi

for i in $*
do
    if [ -f ${i} ]
    then
       ext="${i##*.}"
       case $ext in
           pdf) pdftotext -raw ${i} - ;;
           doc) LANG=ja_JP.utf8 antiword -w 0 ${i} ;;
           docx|odt|html|htm|tex) pandoc -t plain ${i} ;;
           xls|xlsx|ods) tmpfile=$(mktemp).html ;
                         ssconvert -T Gnumeric_html:xhtml ${i} ${tmpfile} 2> /dev/null ;
                         w3m -dump ${tmpfile} ;
                         rm -f ${tmpfile} ;;
           *)    ;;
       esac
    fi
done

doc

Emacs上で antiword を使用したときに”LANG=ja_JP.utf8″ をつけないと文字化けしたため、環境変数を一時的に設定しています。

docx/odt/html/htm/tex

pandoc の機能をそのまま使用しているだけなので、必要に応じて対応している形式を追加すればいいです。

xls/xlsx/ods

今回苦労したのがこれらのスプレッドシートです。

調べていると gnumeric に含まれる ssconvert というコマンドで html形式に変換できることが分かったため、それを使用しました。 html形式に変換した後に w3m の-dumpオプションでテキスト形式に変換しています。

pandocでhtmlをテキスト形式に変換すると表のレイアウトが崩れてしまったため、今回はw3mを使用しています。

使用法

実行権限をつけて

convertdoc file1 file2 ...

のようにすると、全てのファイルがつながって標準出力に表示されます。

存在しないファイルおよび対応していないファイルは無視されます。エラーも出ないようにしています。

応用

以下のようなelispスクリプトを書き、 M-x my-convertdoc の後に開きたいファイルを選択するとファイルの内容を確認することができます。

Emacs上でMewを使用しており、添付ファイルの内容を確認したかったというのがそもそもの始まりです。

添付ファイルを保存してから M-x my-convertdoc コマンドを実行しなければならないため手間はかかりますが、それでも楽になりました。

elispスクリプト

(defvar my-convertdoc-command "convertdoc")
(defvar my-convertdoc-defaultdir "~/ramdisk/") ;; デフォルトのフォルダ(任意の場所)

(require 'f)

(defun my-convertdoc (file)
  (interactive
   (list (read-file-name "Input file name: "
                         my-convertdoc-defaultdir nil t)))
  (my-convertdoc-file file))

(defun my-convertdoc-file (file)
  (let ((filename (shell-quote-argument (f-expand file)))
        (buf "*ConvertDoc*")
        (resize-mini-windows nil))
      (shell-command
       (format "%s %s" my-convertdoc-command filename) buf)
      (with-current-buffer buf
        (view-mode))))
Toshiaki Ara