2017年2月17日
JavascriptでMSOffice文書からテキストを抽出
MSOffice文書はOffice Open XMLの規格に則り、ファイルの中身はXMLで記述されています。これらのXMLファイルをzip化したものが、docx、xlsxやpptxと言うファイル識別子のファイルとなっています。従ってこれらのファイル識別子をzipに変更すると、ファイルの中身を見ることができます。MSOffice文書を解凍し、フォルダ構成を見てみましょう。MSOffice文書のテキスト情報は、word/document.xml、xl/sharedStrings.xml、ppt/slides/slide1.xmlの中に入っています。
MSOffice文書をパースし、テキスト情報を抽出
・まず、”javascriptでDOCX,ODTをプレーンテキストに”に従って、zipファイルから対象となるXMLファイルを読み込みます。
・得られたテキスト情報をDOMParserでXMLオブジェクトを得ます。
・テキスト情報は、wordでは<w:t></w:t>、excelでは<t></t>、powerpointでは<a:t></a:t>の中に入っています。
namespace属性付きのものはnamespaceをつけてgetElementByTagNameすれば、それぞれのタグを持ったデータが取得できます。
動作環境
・DOMParserが使えるブラウザ
・JSZip (
https://stuk.github.io/jszip/ ) jsでzipファイルを読み書きするため
コード
<!DOCTYPE html>
<html>
<head>
<!--
MSOffice文書からテキストを抽出
javascriptでDOCX,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文書を作りたくなります。
記 大坂哲司