今回は、ScalaのXMLバインディングツールであるScalaxbを使ってbiz-StreamでPDFやExcelを生成する方法を説明したいと思います。
弊社製品のbiz-StreamにはWebサービスサーバ機能というものがあり、これは、SOAP経由でPDFなどを動的に生成することができます。
SOAPでWebサービスにアクセスするためのコードを自動生成してくれるソリューションが各プログラミング言語毎に複数存在しますが、今回はその中でもScalaで比較的手軽に使用できるScalaxbを利用した例を紹介したいと思います。
Typesafe Stack を導入
まず、Typesafe社のサイトからTypesafe Stack(本記事では2.0.1にて確認)をダウンロードしインストールします。
giter8でプロジェクトの雛形を生成
giter8を使って今回作成するScalaxbを利用したScalaプロジェクトの雛形を生成します。
(giter8はTypesafe Stackに含まれています)
- 《 g8 》
-
g8 rkyymmt/basic-project.g8
IDE向けのプロジェクトファイルを生成
次に利用しているIDE向けのプロジェクトファイルを生成します。
- 《 IDEA IntelliJ向け 》
-
sbt gen-idea
- 《 Eclipse向け 》
-
sbt eclipse
WSDL/XMLスキーマを用意
src/main/wsdlにbiz-Stream WebサービスサーバのWSDLファイルを置きます。
取得元:
http://ホスト名:8080/axis2/services/bizstream?wsdl
また、上記WSDLファイルから参照されているXMLスキーマについても、Webブラウザなどでダウンロードし、src/main/xsdに置きます。
取得元:
http://ホスト名:8080/axis2/services/bizstream?xsd=common.xsd
http://ホスト名:8080/axis2/services/bizstream?xsd=bsws.xsd
ひな形ファイルを修正
生成されたApp.scalaファイルを次のように修正します。
- 《 App.scala 》
-
package com.example.scalaxbwss import generated._ import scalaxb.{DataRecord, DispatchHttpClients, SoapClients} import java.net.URI import java.awt.Desktop object App { val layoutXml = <Layout Width="210mm" Height="297mm" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:table x="5mm" y={(297-5)+"mm"}> <fo:table-column column-width="100mm"/> <fo:table-column column-width="100mm"/> <fo:table-header background-color="222,222,222"> <fo:table-row> <fo:table-cell border-color="0,0,0"> <Label>ヘッダ行:列1</Label> </fo:table-cell> <fo:table-cell border-color="0,0,0"> <Label>ヘッダ行:列2</Label> </fo:table-cell> </fo:table-row> </fo:table-header> <fo:table-body> <fo:table-row> <fo:table-cell border-color="0,0,0"> <Label>ボディ行:行1列1</Label> </fo:table-cell> <fo:table-cell border-color="0,0,0"> <Label>ボディ行:行1列2</Label> </fo:table-cell> </fo:table-row> <fo:table-row> <fo:table-cell border-color="0,0,0"> <Label>ボディ行:行2列1</Label> </fo:table-cell> <fo:table-cell border-color="0,0,0"> <Label>ボディ行:行2列2</Label> </fo:table-cell> </fo:table-row> </fo:table-body> </fo:table> </Layout> def main(args: Array[String]) { val bizstreamService = (new BizstreamSOAP12Bindings with SoapClients with DispatchHttpClients { //// for change host url // override val baseAddress = new URI("http://localhost:8080/axis2/services/bizstream.BizstreamSOAP12port/") }) val response = bizstreamService.service.generateOutput( //// for output Pdf output = Output(DataRecord(None, Some(Pdf.toString), Pdf(Some(DataRecord(None, Some(File.toString), File(name = Some("test.pdf"))))))), //// for output Excel // output = Output(DataRecord(None, Some(Excel.toString), Excel(Some(DataRecord(None, Some(File.toString), File(name = Some("test.xls"))))))), resource = None, signatureGroups = None, urlResourceAuth = None, manipulators = None, layoutData = LayoutData(layoutDefinition = LayoutDefinition(Seq(DataRecord(None, None, layoutXml.toString())))) ) response.right.map { case res: GenerateOutputResponse => res.generateoutputresponseoption.get.value match { case File(_, _, Some(fileUri)) => Desktop.getDesktop.browse(new URI(fileUri)) } } } }
9行目:biz-Streamのレイアウト定義XMLです。この例では、ヘッダ付きの表を描画しています。
46行目~:SOAPサービスを生成しています。
48行目:WSDLを取得した際と異なるホストへアクセスする場合にコメントインします。
52行目:PDFを生成するためのメッセージを生成しています。
54行目:Excelを生成するためのメッセージを生成する場合は上記をコメントアウトしこ、この行をコメントインします。
61行目~:受信したSOAPメッセージから生成ファイルの場所を取得し、Webブラウザにて参照します。
実行
次のコマンドを入力し実行します。
- 《 実行 》
-
sbt run-main com.example.scalaxbwss.App
このような感じでScalaxbを利用することでbiz-Stream Webサービスサーバを
簡単に利用することができます。