今回は、前回の紹介編にて予告していました、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ファイルが生成されます。
次回は、もうちょっと帳票らしく外部からのデータ設定の方法を紹介したいと思います。