ScalaxbとScalaで楽々PDF生成

今回は、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サービスサーバを
簡単に利用することができます。

biz-Stream詳細情報  biz-Stream資料請求

超高速!!高機能!! Web帳票ソリューション biz-Stream

オンデマンドかつリアルタイムにビジネスドキュメントを生成する帳票ソリューション