Scala 実践編(1) biz-Streamライブラリの利用方法

今回は、前回の紹介編にて予告していました、Scalaによるbiz-Streamのプログラミングを紹介したいと思います。

Scalaの実行環境は次のオフィシャルサイトからダウンロードすることができます。
まだ導入されていない場合は、ダウンロードし導入してみてください。
なお、ScalaはJava環境上で動作するため、あらかじめJDKを導入しておく必要があります。

Scalaダウンロード
http://www.scala-lang.org/downloads

ちなみに、Eclipse Netbeans IntelliJ IDEAなどのJava系IDEでもScala開発用プラグインがありますので、各IDEをご利用の方はそちらを導入したほうが簡単かと思います。

まず実践編第1回目の今回は、biz-Streamのページレイアウト定義をプログラム上で動的に作成してPDFを生成する例を解説します。

ソースコードは次のようになります。

《 Scalaからbiz-StreamによりPDFを生成するソースコード 》
import com.brainsellers.xml.JaxpXML
import java.io.StringReader
import javax.xml.parsers.DocumentBuilderFactory
import org.xml.sax.InputSource
import xml.NodeSeq

object run {
  val width = 210
  val height = 297
  val divide = 333
  val stepX: Double = width / divide
  val stepY: Double = height / divide
  val stepColor: Double = 255 / divide

  def makeColor(brightness: String) = brightness + "," + brightness + "," + brightness

  def makeLayoutXml(title: String) =
    <Layout>
      <Label FontColor="#0000ff" FontSize="40" X="30" Y={(height / 2).toString}
        Width="150" Height="50">{title}</Label>{
      for {
        step <- 0 to divide
        color = makeColor((stepColor * step).toInt.toString)
        x = stepX * step
        y = stepY * step
      } yield {
        <Line LineColor={color}
          StartX="0" StartY={y.toString}
          EndX={x.toString} EndY={height.toString}/>
        <Line LineColor={color}
          StartX={(width - x).toString} StartY="0"
          EndX={width.toString} EndY={(height - y).toString}/>
      }
    }</Layout>

  def nodeSeqToDocument(xml: NodeSeq) =
    DocumentBuilderFactory.newInstance.newDocumentBuilder.parse(
      new InputSource(new StringReader(xml.toString)))

  def main(args: Array[String]) {
    val bizLib = {
      val title = if (args.length > 1) args(1) else "Powered by biz-Stream"
      new JaxpXML(nodeSeqToDocument(makeLayoutXml(title)), args(0))
    }
    bizLib.parse
    bizLib.calcDataSize
    bizLib.setPageSize("A4")
    bizLib.toPDF
    bizLib.close
  }
}

上記プログラムでは、まずrunというobjectを作成しています。
objectというキーワードは、シングルトンオブジェクトの定義の際に使用します。
また、Javaのpublic static void main(String[] args){}にあたるのが、
Scalaのdef main(args: Array[String]) {}になります。
実行時にはこちらのメソッドがはじめに呼ばれます。

なお、Scalaではメソッド定義はdefというキーワードで始まります。
mainメソッド内ではbiz-Streamライブラリを呼び出しPDFを生成しています。
この際にbiz-Streamへ渡すレイアウト定義は、まずmakeLayoutXmlメソッドにてScala上のXMLオブジェクトを作成し、その後、nodeSeqToDocumentメソッドで、ScalaのXMLオブジェクトからJavaのXMLオブジェクトであるorg.w3c.dom.Documentへ変換しています。

全体を見てみると次のようなJavaと異なる部分に気がつくと思います。

  • returnがないのに値が返っている(Scalaではメソッド中の最後の定義の値を返します)
  • メソッド名の後に()がない(Scalaでは引数が無い場合は()を省略できます)
  • 型名が変数名の後ろにある(Scalaでは変数名:型名という順番に記述します)
  • 型名が省略されているところがある(Scalaではコンパイラが自動的に推測できる場合は型名を省略することができます)
  • XMLがソースコードに直接記述されている(Scalaではリテラルの一種としてXMLリテラルというものが容易されています)
  • XMLの途中に変数やfor文が混ざっている(ScalaではXMLリテラル中に{}でくくった変数などを含ませることができます)

サンプルプログラムを保存したファイル名を、bs.scala とすると、以下のようにコンパイルを実行します。

$> scalac bs.scala

run.class以下いくつかのclassファイルが生成されますので、bs.pdfファイルを生成するため、以下を実行します。

$> scala run bs.pdf

すると、以下のようなPDFファイルが生成されます。

Scalaで作成したPDF

次回は、もうちょっと帳票らしく外部からのデータ設定の方法を紹介したいと思います。

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

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

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