Eclipse BIRTを使ってみる (1)
単純にDBにあるエントリーをPDFにして出力してみる。BIRTのインストール方法は省略します。但し、最後辺りにBIRT Runtimeな話が出るので http://download.eclipse.org/birt/downloads からダウンロードしておく(一応ダウンロードしなくてもMaven使うのでそこからコピーでも構わない)
pom.xmlを作成
<?xml version="1.0" ?>
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.kinjouj.birt</groupId>
<artifactId>kinjouj_birt</artifactId>
<version>1.0</version>
<name>kinjouj_birt</name>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.eclipse.birt.runtime.3_7_1</groupId>
<artifactId>org.eclipse.birt.runtime</artifactId>
<version>3.7.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
</dependencies>
</project>
まぁ依存性を設定するだけでいいかも。で前述した通り、MySQL JDBC Driverを入れておく。そしてどっかにコピる
レポートファイルを作成
Eclipse起動して、BIRTレポートファイルを作る。まぁまずファイルを作ったらアウトラインに
な感じで出るはず。これをベースに設定を色々していく
データソースの作成
まずデータベースに接続するのでデータソースを設定する。でこの際に今回はMySQLデータベースに接続するので、mysql-connector-javaが必要になる。$HOME/.m2/mysqlからたどってJARファイルをどっかわかりやすい所にコピーしても良い。でデータソースを作成しJDBCドライバな設定を行う
っていう感じでMySQLのJDBC Driverをセットする。で次にJDBC接続に関する情報を設定する
これでJDBCデータソースに関する設定は終わり。
データセットを作成
データベースから取ってくるデータを設定する。単純に指定したデータベースからのSQLを書くだけ
完了を押したらデータセットが作成される。ただ作成しただけじゃダメなので、右クリックから「レイアウトに含める」をクリックする。やったらレイアウト画面にテーブルグリッドが出る。で保存する。このレポートファイルはXMLファイルになっている
で1点微妙な所があってEclipseからレポート生成する際には問題無いようだけど、それ以外の所からやると例外が出る。それが
<report xmlns="http://www.eclipse.org/birt/2005/design" version="3" id="1">
のversion属性が"3.2.xx"みたいになってる場合はメジャーバージョン以外を消しておく。ちょいとこれ原因が分かってない
これでレポートファイルの作成は完了。今回作成したレポートファイルの例は最後に載せる
Client.java
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.engine.api.PDFRenderOption;
import org.eclipse.birt.report.engine.api.RenderOption;
import org.eclipse.birt.report.engine.api.ReportEngine;
public class Client {
public static void main(String[] args) throws Exception {
EngineConfig config = new EngineConfig();
/* やらなくても良いっぽい
config.setEngineHome("/opt/birt");
*/
ReportEngine engine = new ReportEngine(config);
IReportRunnable design = engine.openReportDesign("sample.rptdesign");
IRunAndRenderTask task = engine.createRunAndRenderTask(design);
RenderOption options = new PDFRenderOption();
options.setOutputFileName("sample.pdf");
options.setOutputFormat(RenderOption.OUTPUT_FORMAT_PDF);
task.setRenderOption(options);
task.run();
}
}
コンパイルして実行するとsample.rptdesign(レポートファイル)がsample.pdfとして出力される。
備考1: Mavenを使わずに実行する場合
めっちゃ多いんですが
- org.eclipse.birt.runtime_4.2.1.v20120918-1113.jar
- org.eclipse.equinox.common_3.6.100.v20120522-1841.jar
- org.eclipse.equinox.registry_3.5.200.v20120522-1841.jar
- org.eclipse.core.runtime_3.8.0.v20120521-2346.jar
- org.eclipse.osgi_3.8.1.v20120830-144521.jar
- org.eclipse.datatools.connectivity.oda_3.3.3.v201110130935.jar
- org.eclipse.datatools.connectivity.oda.consumer_3.2.5.v201109151100.jar
- org.eclipse.datatools.connectivity_1.2.6.v201208210832.jar
- org.apache.batik.css_1.6.0.v201011041432.jar
- org.apache.batik.util_1.6.0.v201011041432.jar
- org.apache.commons.codec_1.3.0.v201101211617.jar
- org.apache.xerces_2.9.0.v201101211617.jar
- com.ibm.icu_4.4.2.v20110823.jar
- com.lowagie.text_2.1.7.v201004222200.jar
- org.w3c.css.sac_1.3.0.v200805290154.jar
- js.jar
- Tidy.jar
- mysql-connector-java-5.1.21.jar
というような感じで、今回のサンプルを動かすのにこれだけ必要。でこれMavenからのではなくBIRT Runtimeな所からコピーしているのでpom.xmlで指定したバージョン(3.7.1)とは若干異なりますが...
備考2: 今回のサンプルレポートファイル
長いので注意
<?xml version="1.0" encoding="UTF-8"?>
<report xmlns="http://www.eclipse.org/birt/2005/design" version="3" id="1">
<property name="createdBy">Eclipse BIRT Designer Version 3.7.2.v20120213 Build <3.7.2.v20120214-1408></property>
<property name="units">in</property>
<property name="layoutPreference">auto layout</property>
<data-sources>
<oda-data-source extensionID="org.eclipse.birt.report.data.oda.jdbc" name="データ・ソース" id="44">
<list-property name="privateDriverProperties">
<ex-property>
<name>metadataBidiFormatStr</name>
<value>ILYNN</value>
</ex-property>
<ex-property>
<name>disabledMetadataBidiFormatStr</name>
</ex-property>
<ex-property>
<name>contentBidiFormatStr</name>
<value>ILYNN</value>
</ex-property>
<ex-property>
<name>disabledContentBidiFormatStr</name>
</ex-property>
</list-property>
<property name="odaDriverClass">com.mysql.jdbc.Driver</property>
<property name="odaURL">jdbc:mysql://localhost/knowdb</property>
<property name="odaUser">ユーザー名</property>
<encrypted-property name="odaPassword" encryptionID="base64">パスワードのBASE64</encrypted-property>
</oda-data-source>
</data-sources>
<data-sets>
<oda-data-set extensionID="org.eclipse.birt.report.data.oda.jdbc.JdbcSelectDataSet" name="データ・セット" id="45">
<list-property name="resultSetHints">
<structure>
<property name="position">1</property>
<property name="name">id</property>
<property name="nativeName">id</property>
<property name="dataType">integer</property>
<property name="nativeDataType">4</property>
</structure>
<structure>
<property name="position">2</property>
<property name="name">title</property>
<property name="nativeName">title</property>
<property name="dataType">string</property>
<property name="nativeDataType">12</property>
</structure>
</list-property>
<list-property name="columnHints">
<structure>
<property name="columnName">id</property>
<text-property name="displayName">ID</text-property>
<text-property name="heading">id</text-property>
</structure>
<structure>
<property name="columnName">title</property>
<text-property name="displayName">タイトル</text-property>
<text-property name="heading">title</text-property>
</structure>
</list-property>
<structure name="cachedMetaData">
<list-property name="resultSet">
<structure>
<property name="position">1</property>
<property name="name">id</property>
<property name="dataType">integer</property>
</structure>
<structure>
<property name="position">2</property>
<property name="name">title</property>
<property name="dataType">string</property>
</structure>
</list-property>
</structure>
<property name="dataSource">データ・ソース</property>
<xml-property name="queryText"><![CDATA[select id,title from entry]]></xml-property>
<xml-property name="designerValues"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<model:DesignValues xmlns:design="http://www.eclipse.org/datatools/connectivity/oda/design" xmlns:model="http://www.eclipse.org/birt/report/model/adapter/odaModel">
<Version>2.0</Version>
<design:ResultSets derivedMetaData="true">
<design:resultSetDefinitions>
<design:resultSetColumns>
<design:resultColumnDefinitions>
<design:attributes>
<design:identifier>
<design:name>id</design:name>
<design:position>1</design:position>
</design:identifier>
<design:nativeDataTypeCode>4</design:nativeDataTypeCode>
<design:precision>11</design:precision>
<design:scale>0</design:scale>
<design:nullability>NotNullable</design:nullability>
<design:uiHints>
<design:displayName>id</design:displayName>
</design:uiHints>
</design:attributes>
<design:usageHints>
<design:label>id</design:label>
<design:formattingHints>
<design:displaySize>11</design:displaySize>
</design:formattingHints>
</design:usageHints>
</design:resultColumnDefinitions>
<design:resultColumnDefinitions>
<design:attributes>
<design:identifier>
<design:name>title</design:name>
<design:position>2</design:position>
</design:identifier>
<design:nativeDataTypeCode>12</design:nativeDataTypeCode>
<design:precision>100</design:precision>
<design:scale>0</design:scale>
<design:nullability>NotNullable</design:nullability>
<design:uiHints>
<design:displayName>title</design:displayName>
</design:uiHints>
</design:attributes>
<design:usageHints>
<design:label>title</design:label>
<design:formattingHints>
<design:displaySize>100</design:displaySize>
</design:formattingHints>
</design:usageHints>
</design:resultColumnDefinitions>
</design:resultSetColumns>
<design:criteria/>
</design:resultSetDefinitions>
</design:ResultSets>
</model:DesignValues>]]></xml-property>
</oda-data-set>
</data-sets>
<styles>
<style name="report" id="2"/>
<style name="label" id="3"/>
<style name="text" id="4"/>
<style name="data" id="5"/>
<style name="table" id="6"/>
<style name="grid" id="7"/>
<style name="list" id="8"/>
<style name="image" id="9"/>
</styles>
<page-setup>
<simple-master-page name="Simple MasterPage" id="10">
<property name="topMargin">1in</property>
<property name="leftMargin">1.25in</property>
<property name="bottomMargin">1in</property>
<property name="rightMargin">1.25in</property>
<page-header>
<grid id="11">
<property name="width">100%</property>
<column id="12"/>
<row id="13">
<cell id="14">
<property name="fontSize">xx-large</property>
<property name="fontWeight">bold</property>
<property name="textAlign">center</property>
<text id="15">
<property name="marginBottom">30px</property>
<property name="contentType">auto</property>
<text-property name="content"><![CDATA[タイトル]]></text-property>
</text>
</cell>
</row>
</grid>
</page-header>
<page-footer>
<grid id="16">
<property name="width">100%</property>
<column id="17"/>
<row id="19">
<cell id="20">
<text id="21">
<property name="contentType">html</property>
<text-property name="content"><![CDATA[<value-of>new Date()</value-of>]]></text-property>
</text>
</cell>
</row>
</grid>
</page-footer>
</simple-master-page>
</page-setup>
<body>
<table id="46">
<property name="dataSet">データ・セット</property>
<list-property name="boundDataColumns">
<structure>
<property name="name">id</property>
<text-property name="displayName">ID</text-property>
<expression name="expression">dataSetRow["id"]</expression>
<property name="dataType">integer</property>
</structure>
<structure>
<property name="name">title</property>
<text-property name="displayName">タイトル</text-property>
<expression name="expression">dataSetRow["title"]</expression>
<property name="dataType">string</property>
</structure>
</list-property>
<property name="pageBreakInterval">50</property>
<column id="60"/>
<column id="61"/>
<header>
<row id="47">
<cell id="48">
<label id="49">
<text-property name="text">ID</text-property>
</label>
</cell>
<cell id="50">
<label id="51">
<text-property name="text">タイトル</text-property>
</label>
</cell>
</row>
</header>
<detail>
<row id="52">
<cell id="53">
<data id="54">
<property name="resultSetColumn">id</property>
</data>
</cell>
<cell id="55">
<data id="56">
<property name="resultSetColumn">title</property>
</data>
</cell>
</row>
</detail>
<footer>
<row id="57">
<cell id="58"/>
<cell id="59"/>
</row>
</footer>
</table>
</body>
</report>