Eclipse BIRTを使ってみる (1)

2012-10-31T00:00:00+00:00 Eclipse BIRT Java

単純に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>

Eclipse BIRTを使ってみる (2) - データバインディング - Ubuntuでusermodの修復