コンテントのサイズ変更

このページでは、以下の帳票を作成します。

この帳票の特徴は、 コンテントの高さが渡されたデータの値に応じて動的に決まるという点です。 今回の例では、データにはHEIGHTという列が含まれており、 その値がコンテントの高さになるようにします。

コンテントサイズ変更のサンプル
サンプルについて
完成したサンプルが example フォルダ内に以下の名前で含まれています。 帳票定義ファイル: example_region.rrpt ソースコード: ExampleRegion.cs、ExampleRegion.vb、ExampleRegion.java

カスタマイザのContentRegionメソッドによって、コンテントの領域を動的に変更することができます。 カスタマイザを実装するには、DefaultCustomizerクラスを継承します。 コードは以下のようになります。

  // C#

  // コンテントのサイズを動的に変更するカスタマイザ
  private class Customizer : DefaultCustomizer
  {
      public override Region ContentRegion(Content content, Evaluator evaluator, Region region)
      {
          // "content_example"という識別子を持ったコンテントに対して処理を行います
          if ("content_example".Equals(content.Design.Id))
          {
              // regionはコンテントの表示領域を表します
              // ".HEIGHT"という式を評価することでHEIGHT列の値を取得し、
              // コンテントの高さを設定します
              Region ret = new Region(region); // regionのクローンを作成します
              ret.SetHeight((float)evaluator.EvalTry(".HEIGHT"));
              return ret;
          }
          else
          {
              return region;
          }
      }
  }
  ' VisualBasic

  ' コンテントのサイズを動的に変更するカスタマイザ
  Private Class Customizer
      Inherits DefaultCustomizer
      Public Overrides Function ContentRegion( _
        ByVal content As Content, _
        ByVal evaluator As Evaluator, _
        ByVal region As Region) As Region
          ' "content_example"という識別子を持ったコンテントに対して処理を行います
          If "content_example".Equals(content.Design.Id) Then
              ' regionはコンテントの表示領域を表します
              ' ".HEIGHT"という式を評価することでHEIGHT列の値を取得し、
              ' コンテントの高さを設定します
              Dim ret As New Region(region) ' regionのクローンを作成します
              ret.SetHeight(evaluator.EvalTry(".HEIGHT"))
              Return ret
          Else
              Return region
          End If
      End Function
  End Class
  // Java

  // コンテントのサイズを動的に変更するカスタマイザ
  private static class Customizer extends DefaultCustomizer{
      @Override
      public Region contentRegion(
              Content content,
              Evaluator evaluator,
              Region region) {
          // "content_example"という識別子を持ったコンテントに対して処理を行います
          if ("content_example".equals(content.design.id)){
              // regionはコンテントの表示領域を表します
              // ".HEIGHT"という式を評価することでHEIGHT列の値を取得し、
              // コンテントの高さを設定します
              float height = Cast.toFloat(evaluator.evalTry(".HEIGHT"));
              Region ret = new Region(region); // regionのクローンを作成します
              ret.setHeight(height);
              return ret;
          }else{
              return region;
          }
      }
  }

ContentRegionメソッドは、コンテントの表示領域を決定する必要が生じるたびに呼ばれます。 引数のregionがデフォルトの表示領域です。 表示領域を変更しないならば、このregionをそのまま戻り値とします。

ここでは、"content_example"という識別子が振られたコンテントに対し、 HEIGHT列の値を高さとして設定しています。 Regionへの修正はクローンを作成してから行うようにしてください。 なお、今回の例では示しませんが、NULLを戻り値とするとそのコンテントを非表示にすることができます。

evaluator.evalTryメソッドは、引数で指定された式を評価してその値を返すメソッドです。 もしも式の評価に失敗したとしても例外を発生させることはなく、単にNULLを返します。 例外をキャッチしたい場合は、代わりにevaluator.evalメソッドを利用します。

作成したカスタマイザはReportオブジェクトのコンストラクタに渡します。 帳票出力のコードは以下のようになります。

  // C#

  // 第2引数にCustomizerオブジェクトを渡します
  Report report = new Report(Json.Read("report\\example_region.rrpt"), new Customizer());
  report.Fill(new ReportDataSource(getDataTable()));
  ReportPages pages = report.GetPages();

  // PDF出力
  using (FileStream fs = new FileStream("output\\example_region.pdf", FileMode.Create))
  {
      PdfRenderer renderer = new PdfRenderer(fs);
      renderer.Setting.ReplaceBackslashToYen = true;
      pages.Render(renderer);
  }
  ' VisualBasic

  ' 第2引数にCustomizerオブジェクトを渡します
  Dim report As New Report(Json.Read("report\example_region.rrpt"), New Customizer)
  report.Fill(New ReportDataSource(getDataTable))
  Dim pages As ReportPages = report.GetPages()

  ' PDF出力
  Using fs As New FileStream("output\example_region.pdf", IO.FileMode.Create)
      pages.Render(New PdfRenderer(fs))
  End Using
  // Java

  // 第2引数にCustomizerオブジェクトを渡します
  Report report = new Report(ReadUtil.readJson("report/example_region.rrpt"), new Customizer());
  report.fill(new ReportDataSource(getDataTable()));
  ReportPages pages = report.getPages();

  // PDF出力
  {
      FileOutputStream fos = new FileOutputStream("output/example_region.pdf");
      try{
          pages.render(new PdfRenderer(fos));
      }finally{
          fos.close();
      }
  }