sMash a Office : WordとPowerPointファイルのテキストを取得

Posted by KenTa on 4 月 23rd, 2009. Other posts by KenTa

先日の記事では、Apache POIを利用して、Excelのデータを取得する方法を書きました。今回は、WordとPowerPointのテキストを取得してみましょう。この機能を利用すれば、WordやPowerPointファイルの中身までキーワード検索したり、特定の禁止用語などが含まれていないかチェックすることが可能です。
まず、Wordのテキストを取得するコードは、このようになります。
java.io.FileInputStream fs = new java.io.FileInputStream(file_path);
WordExtractor we = new WordExtractor(fs);
String text = we.getText();
file_pathには、ファイルのパスを入力してください。これで、変数textに、Wordに書かれたテキストが全て格納されます。
次に、PowerPointのテキストを取得するコードです。
java.io.FileInputStream fs = new java.io.FileInputStream(file_path);
HSLFSlideShow hsss = new HSLFSlideShow(fs);
SlideShow ss= new SlideShow(hsss);
Slide[] slides = ss.getSlides();
String text = “”;
for (int i = 0; i < slides.length; i++) {
TextRun[] textruns = slides[i].getTextRuns(); 
for (int j = 0; j < textruns.length; j++) {
text += textruns[j].getRawText();
}
}
これで、全てのテキストを変数textに格納することができます。また、Slideクラスの配列の数字が、ページ番号に対応しますので、何ページにその単語があるのかを調べることも簡単に行えます。

PHP on sMash - 第16回 PHP/Groovy Bridge

Posted by KenTa on 4 月 20th, 2009. Other posts by KenTa

PHP on sMash 第16回は、Groovy Bridgeです。前回はJava Bridgeを紹介しましたが、v1.1からGroovyのクラスを利用できるようになりました。これによって、既存資産がJavaであっても、Groovyであっても、そのクラスをPHPから利用してコードを書くことができるようになりました。それでは、始めていきましょう。

WebSphere sMash 1.1.0.1がリリースされました

Posted by KenTa on 4 月 20th, 2009. Other posts by KenTa

英語Blogでも既に告知されていますが、sMash v1.1.0向けのfixpack1がリリースされました。リポジトリはこちらです。
fixpack1で修正されたBugのリストは、こちらにあります。
Bug8008やBug8149など日本語関連のBugもいくつか修正されていますので、v1.1をご利用になっていて、phpBBやSugarCRMの日本語版をテストしてみる際は、こちらのfixpackを適用してください。

sMash plug-inがPDT2.0をサポートしました

Posted by KenTa on 4 月 20th, 2009. Other posts by KenTa

こちらも英語Blogで既に告知されていたのですが、eclipseのPHP用プラグインであるPDT2.0を、sMash eclipse plug-inがサポートしました。既にPDT2.0を利用されている場合は、plug-inのアップデートを行ってください。
plug-inのアップデートを行うには、eclipseのメニューから以下の手順を行います。
Help > Software Updates > Available Software タブ > zero.eclipse.phpを展開 > WebSphere sMash for PDT 2.0.x にチェックを入れる > 右上のInstallボタンをクリック
後は画面の指示に従って、Install作業を行います。インストールするフィーチャーを選択する際に、PDT 1.0.xを選択しないように注意して下さい(for PDT 1.0.xと2.0.xを両方インストールしてしまうと、プロジェクト作成時に”sMash PHP application”が2つ表示されてしまいます)。インストールしてしまった場合は、Installed SoftwareからWebSphere sMash PDT Featureを選択し、Uninstallボタンをクリックしてください。
ちなみに、eclipseでの開発環境を0から整える方法は、こちらで紹介しています。PDT all-in-one package自体は、こちらからダウンロードしてください(DebuggerはsMash plug-inに含まれているため、必要ありません)。

sMashのロケール設定

Posted by KenTa on 4 月 16th, 2009. Other posts by KenTa

sMashのログ・メッセージなどは、システム・ロケールを参照しているため、特にロケール設定を行う箇所はありません。そのため、日本語環境では、デフォルトで日本語でログ・メッセージが表示されます。
この設定を変えるためには、JVMのオプション値 -Duser.language=(ロケール名) を与えて、明示的にロケールを設定する必要があります。例えば、英語でログ・メッセージを表示させたい場合は、-Duser.language=enを与える必要があります。
CLIのロケール設定を変えるには、zero.bat (zero.sh)をエディターで開き、set ZERO_OPTS=-Duser.language=enという行を追加します。eclipseの場合は、起動オプションに上記のオプションを追加します(Run as > Run configurations > (アプリケーション名) > Argumentsタブ > VM arguments > -Duser.language=enを追記)。

sMash a Office

Posted by KenTa on 4 月 14th, 2009. Other posts by KenTa

sMashでは、Apache POIをモジュールとして提供しています。Apache POIは、Microsoft Officeのファイルを操作するAPIを提供するJavaのモジュールです。これを利用することで、sMashで容易にApache POIの利用環境を作ることができます。また、Java Bridgeを利用することで、PHPを用いてMicrosoft Officeのファイルを操作することが可能です。
●利用するための準備
Apache POIは、zero.office.integrationという名前で提供されています。このモジュールへの依存性を、ivy.xmlに追加します。これで準備は完了です。
●Excelファイルを作ってみる
まず最初に、Excelファイルを生成してみましょう。せっかくですので、ここではPHPでやってみましょう。generate.phpとして、次のファイルをpublicフォルダに作成してください(コピー&ペーストするとダブルクォーテーションが全角になるので注意して下さい)。
<?php
 java_import(”java.io.FileOutputStream”);
 java_import(”org.apache.poi.hssf.usermodel.HSSFWorkbook”);
 java_import(”org.apache.poi.poifs.filesystem.POIFSFileSystem”);
 $filedir = zget(”/config/root”).”\\public\\sMash.xls”;
 try{
  //新規ワークブックを作成する
  $wb = new HSSFWorkbook();
  $fileOut = new FileOutputStream($filedir);
   //新規ワークシートを作成する
  $sheet = $wb->createSheet();
  $wb->setSheetName(0, “シート01″, $wb->ENCODING_UTF_16);
  //A1に日本語を書き込む
  $row = $sheet->createRow(0);
  $cell = $row->createCell(0);
  $cell->setEncoding($wb->ENCODING_UTF_16);
  $cell->setCellValue(”sMashでExcelファイルを作りました!”);
//終了処理
  $wb->write($fileOut);
  $fileOut->close();
  echo(”Excelファイルの作成が完了しました!”);
} catch (Exception $e) {
echo $e;
echo(”処理が失敗しました”);
}
?>
作成したら、sMashアプリケーションを起動し、http://localhost:8080/generate.phpにアクセスしてみてください。publicフォルダ内にsMash.xlsファイルが生成されているはずです。
●Excelファイルを読み込んでみる
では、そのExcelファイルを読み込んで、PHPで文字列として表示してみましょう。read.phpとして、次のファイルをpublicフォルダに作成してください(コピー&ペーストするとダブルクォーテーションが全角になるので注意して下さい)。
<?php
 java_import(”java.io.FileInputStream”);
 java_import(”org.apache.poi.hssf.usermodel.HSSFWorkbook”);
 java_import(”org.apache.poi.poifs.filesystem.POIFSFileSystem”);
 $filedir = zget(”/config/root”).”\\public\\sMash.xls”;
 try{
//ファイル読み込み
  $filein = new POIFSFileSystem(new FileInputStream($filedir));
//1つ目のシートの、A1を示すセルのオブジェクトを取得する
$wb = new HSSFWorkbook($filein);
$sheet = $wb->getSheet($wb->getSheetName(0));
  $row = $sheet->getRow(0);
  $cell = $row->getCell(0);
//文字列を取得し、出力
  echo $cell->getStringCellValue();
 }  catch (Exception $e) {
  echo $e;
  echo(”処理が失敗しました”);
 }
?>
作成したら、sMashアプリケーションを起動し、http://localhost:8080/read.phpにアクセスしてみてください。”sMashでExcelファイルを作りました!”と表示されていれば成功です。
●参考情報
他にもApache POIでは、計算式を読み込んだり、セルにコメントを追加したり、そのコメントを読み込んだり、様々なAPIが提供されています。詳細については、Apache POIのWebサイトをご参照下さい。http://poi.apache.org/

File Upload

Posted by nobusue on 3 月 11th, 2009. Other posts by nobusue

画像共有サイトなどを構築する場合、ファイルアップロード処理が必要になります。
sMashはファイルアップロード処理も容易に実装することができるのですが、ドキュメントにあまり詳しい記述がないようなので、簡単にまとめておきます。
Forumを検索すると、以下のスレッドがヒットします。
https://www.projectzero.org/forum/viewtopic.php?f=4&t=984&p=4125
どうやら、普通にmultipart/form-dataでPOSTすれば、勝手にmultipartがdecodeされ、ファイル実体への参照はグローバルコンテキスト(/request/files)に格納されるようです。
HTMLの方はこんな感じ。
[public/testUpload.gt]
<html>
<head>
<style type=”text/css”>
@import “<%= getRelativeUri(”/dijit/themes/tundra/tundra.css”) %>”;
</style>
<script type=”text/javascript”
src=”<%= getRelativeUri(”/dojo/dojo.js”) %>”
djConfig=”parseOnLoad: true”></script>
<script type=”text/javascript”>
dojo.require(”dijit.form.Form”);
dojo.require(”dijit.form.TextBox”);
dojo.require(”dijit.form.Button”);
</script>
</head>
<body class=”tundra”>
<form dojoType=”dijit.form.Form” id=”myForm” name=”myform1″
encType=”multipart/form-data” action=”testUpload.groovy” method=”POST” onSubmit=””>
<input dojoType=”dijit.form.TextBox” name=”file1″ type=”file”><br/>
<input dojoType=”dijit.form.TextBox” name=”file1″ type=”file”><br/>
<input dojoType=”dijit.form.TextBox” name=”file1″ type=”file”><br/>
<button dojoType=”dijit.form.Button” type=”submit”>送信</button>
</form>
</body>
</html>
サーバー側のコードはこんな感じです。
[public/testUpload.groovy]
def onPOST() {
def files = request.files
def filelist = files['file1']
logger.INFO{ “Uploaded Files: ” + filelist.size().toString() }
logger.INFO{ “Information: ${filelist.toString()}” }
filelist.each{ file ->
def src = new File(file['path'])
new File(”${config.root[]}/tmp/${file['filename']}”).withOutputStream{ out ->
src.eachByte{ out.write(it) [...]

Project Zero First Step

Posted by nobusue on 3 月 9th, 2009. Other posts by nobusue

CodeZineで「はじめて使うProject Zero」という記事が公開されました。
Project Zeroのインストールから、Webベースの開発ツール(Application Builder)でRESTサービスやサーバーサイドマッシュアップを作成するところまで、一通りの流れを説明してあります。これを機会に、ぜひProject Zeroを試してみて下さい。

DB2のpureXMLをsMashから利用する

Posted by nobusue on 3 月 4th, 2009. Other posts by nobusue

DB2にはpureXMLという機能があります。
この機能を利用すると、XML(もしくはXMLのフラグメント)をテーブルの1カラムに格納することができるため、部分的に非定型なデータを効率よく扱うことができます。また、XML列に対してはXPathやXQueryによる検索も可能なため、XMLの良さとRDBの良さを組み合わせて利用することができるのも良い点のひとつです。
ただ、sMashのData Access API(zero.data)からpureXMLを利用する場合、残念ながら標準で用意されているResultHandlerではXML列を素直に取りだすことができません。そこで、こちらを参考に、XML列をStringとして取り出すCustom Handlerを作成してみました。
package handler;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import zero.data.Manager;
import com.ibm.pdq.runtime.handlers.RowHandler;
import com.ibm.db2.jcc.DB2Xml;
public class XmlRowHandler implements RowHandler<Map<String, Object>> {
public Map<String, Object> handle(ResultSet resultSet, Map<String, Object> obj)
throws SQLException {
if (obj == null) {
obj = new HashMap<String, Object>();
}
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
int numColumns = resultSetMetaData.getColumnCount();
for (int i=1; i<=numColumns; i++) {
Object column = resultSet.getObject(i);
if(column instanceof DB2Xml){
obj.put(resultSetMetaData.getColumnName(i).toLowerCase(),
((DB2Xml)column).getString() );
} else {
obj.put(resultSetMetaData.getColumnName(i).toLowerCase(), [...]

PHP on sMash - 第15回 Java bridge -基礎編-

Posted by KenTa on 3 月 2nd, 2009. Other posts by KenTa

PHP on sMash 第15回は、Java bridgeです。sMashでは、PHPからJavaのクラスを容易に利用することができます。そのため、既存のJava資産が存在する場合でも、それを利用して、新たなPHPアプリケーションを作成することができるようになっています。今回は最新版の環境を利用しますので、こちらを参考に開発環境構築を行って下さい。
それでは、始めていきましょう。