2017217

JavascriptMSOffice文書からテキストを抽出

 

MSOffice文書はOffice Open XMLの規格に則り、ファイルの中身はXMLで記述されています。これらのXMLファイルをzip化したものが、docxxlsxpptxと言うファイル識別子のファイルとなっています。従ってこれらのファイル識別子をzipに変更すると、ファイルの中身を見ることができます。MSOffice文書を解凍し、フォルダ構成を見てみましょう。MSOffice文書のテキスト情報は、word/document.xmlxl/sharedStrings.xmlppt/slides/slide1.xmlの中に入っています。

 

テキスト ボックス: xlsx.zip
├─docProps
├─xl
│  │  sharedStrings.xml
│  ├─printerSettings
│  ├─theme
│  ├─worksheets
│  │  └─_rels
│  └─_rels
└─_rels
テキスト ボックス: pptx.zip
├─docProps
├─ppt
│  ├─media
│  ├─printerSettings
│  ├─slideLayouts
│  │  └─_rels
│  ├─slideMasters
│  │  └─_rels
│  ├─slides
│  │  │  slide1.xml
│  │  │   ・・・
│  │  │  slide10.xml
│  │  └─_rels
│  ├─theme
│  └─_rels
└─_rels
テキスト ボックス: docx.zip
├─docProps
├─word
│  │  document.xml
│  ├─theme
│  └─_rels
└─_rels

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MSOffice文書をパースし、テキスト情報を抽出

・まず、”javascriptDOCX,ODTをプレーンテキストにに従って、zipファイルから対象となるXMLファイルを読み込みます。

・得られたテキスト情報をDOMParserXMLオブジェクトを得ます。

・テキスト情報は、wordでは<w:t></w:t>excelでは<t></t>powerpointでは<a:t></a:t>の中に入っています。

 namespace属性付きのものはnamespaceをつけてgetElementByTagNameすれば、それぞれのタグを持ったデータが取得できます。

 

動作環境

DOMParserが使えるブラウザ

JSZip ( https://stuk.github.io/jszip/ ) jszipファイルを読み書きするため

 

コード

<!DOCTYPE html>

<html>

<head>

<!--

              MSOffice文書からテキストを抽出

 

              javascriptDOCX,ODTをプレーンテキストに

                            http://qiita.com/weal/items/fb63b997af702c1b0d18

-->

<meta charset="UTF-8">

<script type="text/javascript" src="jszip.min.js"></script>

<title>docx, xlsx, pptx to txt</title>

<style type="text/css">

#container img {

              max-width: 100%;

}

</style>

<script>

"use strict";

function office2txt() {

              var file = document.getElementById('file').files[0];

              var type = file.name.substring(file.name.indexOf('.') + 1);

              if (type != 'docx' && type != 'xlsx' && type != 'pptx') {

                            alert('MSオフィス文書を選択してください。');

                            return;

              }

 

              if (file) {

                            var fr = new FileReader();

                            fr.addEventListener('load', function() {

                                          var t;

                                          if (type == 'docx') {

                                                        var xml = new JSZip(fr.result).file('word/document.xml').asText();

                                                        var dom = (new DOMParser()).parseFromString(xml, 'application/xml');

                                                        t = dom.getElementsByTagNameNS("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "t");

                                          }

                                          else if (type == 'xlsx') {

                                                        var xml = new JSZip(fr.result).file('xl/sharedStrings.xml').asText();

                                                        var dom = (new DOMParser()).parseFromString(xml, 'application/xml');

                                                        t = dom.getElementsByTagName("t");

                                          }

                                          else if (type == 'pptx') {

                                                        var xml = new JSZip(fr.result).file('ppt/slides/slide1.xml').asText();

                                                        var dom = (new DOMParser()).parseFromString(xml, 'application/xml');

                                                        t = dom.getElementsByTagNameNS("http://schemas.openxmlformats.org/drawingml/2006/main", "t");

                                          }

 

                                          var data = "";

                                          for (var i = 0; i < t.length; i++) {

                                                        data += t[i].textContent + "<br/>";

                                          }

                                          var d = document.getElementById("container");

                                          d.innerHTML = data;

                            });

                            fr.readAsArrayBuffer(file);

              }

}

</script>

</head>

<body>

              <input type="file" id="file" />

              <button id="convert" onclick="office2txt()">convert</button>

              <div id="container" style="width: 610pt; height: 793pt; border: 1px #000 solid; margin-top: 10px;">

              </div>

</body>

</html>

 

デモサイト

文書ファイルはサーバーに送ることはありません、ブラウザのみの処理です。是非お試しを。

 

まとめ

Javascriptでも十分な速さで、MSOffice文書から、簡単にテキストが抽出することができました。

powerpointでは、一つ目のスライドしかテキスト化できていませんが、すべてのスライドからテキストを抽出することも可能です。

文書のXML構造を理解していれば、いろいろな情報を的確に抽出することができます。XMLが操作できるようになると、一部を変更したMSOffice文書を作りたくなります。

記 大坂哲司