Microsoft Word 2007 のテキスト抽出

Word 2007 形式のファイル (*.docx) は,解凍すると word/document.xml に本文(テキスト文章,および書式)に関する情報が格納されてあります.以下は,その OpenXML ファイルからテキストだけを抽出するプログラム.何も考えずに適当に書いただけですが・・・

#include <iostream>
#include <string>
#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_utils.hpp"

template <class XMLNode>
bool extract_word(XMLNode* node) {
    std::string name(node->name());
    if (name == "w:t") {
        std::cout << node->value();
        return true;
    }
    
    for (XMLNode* child = node->first_node(); child != NULL; child = child->next_sibling()) {
        extract_word(child);
    }
    return false;
}

int main(int argc, char* argv[]) {
    if (argc < 2) {
        std::cerr << "format_openxml filename" << std::endl;
        std::exit(-1);
    }
    
    rapidxml::file<char> in(argv[1]);
    try {
        rapidxml::xml_document<char> doc;
        doc.parse<0>(in.data());
        
        extract_word(doc.first_node());
    }
    catch (rapidxml::parse_error& e) {
        int pos = reinterpret_cast<int>(e.where<char>()) - reinterpret_cast<int>(in.data());
        std::cerr << "parse error (" << pos << ") : " << e.what() << std::endl;
        std::exit(-1);
    }
    
    return 0;
}

はてなダイアリーは,コード記法(?正式名称忘れた)だと html の特殊文字エスケープせずとも意図した通りに出力されるので楽で良いです.このせいで,コードを載せる記事ははてな以外では書きたくない病に・・・