spring.svg

【Spring Boot】JasperReportsの導入(Gradle)

SpringBoot

導入

build.gradleに以下を追加し、Gradle を更新します。

build.gradle
implementation 'net.sf.jasperreports:jasperreports:6.17.0'

しかしこれだけでは不十分であり、PDF を出力しようとすると以下のようにClassNotFoundExceptionが発生します。

java.lang.ClassNotFoundException: com.lowagie.text.pdf.PdfContentByte

メッセージの通り、com.lowagie.text.pdf.PdfContentByteが存在しません。

結論から言うと、このエラーが発生する原因はjasperreportsの依存関係にあるライブラリーが取得できていないことにあります。

Gradle では、build.gradlerepositoriesに記載した場所からライブラリを取得します。 環境などにもよるかもしれないのですが、私の場合は以下のようにmavenCentral()がデフォルトで指定されています。

build.gradle
repositories {
  mavenCentral()
}

mavenCentral()は、Maven がデフォルトで使用するセントラルリポジトリを指定することになります。 セントラルリポジトリは具体的に、https://repo1.maven.org/maven2/を指します。

では実際に JasperReports の依存関係を見てみます。 依存関係は、以下の pom ファイルに記載されています。 ただし、使用するバージョンによって異なる点に注意してください。 この記事では執筆時点で最新である6.17.0を参照しています。

https://repo1.maven.org/maven2/net/sf/jasperreports/jasperreports/6.17.0/jasperreports-6.17.0.pom

今回依存関係が解決できていないのは、以下のitextの部分です。

jasperreports-6.17.0.pom
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7.js8</version>

実はこのライブラリ、Maven のセントラルリポジトリには存在しません。 そのため、pom ファイルではこのライブラリがあるリポジトリを以下のように指定してあります。

jasperreports-6.17.0.pom
<repositories>
  <repository>
    <id>jaspersoft-third-party</id>
    <url>https://jaspersoft.jfrog.io/jaspersoft/third-party-ce-artifacts/</url>
  </repository>
</repositories>

Maven を使用しているのであれば、ここの情報から依存関係を解決してくれるため、特別設定は必要ありません。 しかし、Gradle の場合はこの記述があっても依存関係を解決してくれません。 あくまでbuild.gradlerepositoriesに記載されたリポジトリからしかライブラリを検索しません。 一見正しくライブラリが追加されたように見えますが、これが原因で依存関係にあるライブラリが存在しないためClassNotFoundExceptionとなっているということです。

解決策として、build.gradlerepositoriesに pom ファイルで指定しているリポジトリを以下のように追加します。

build.gralde
repositories {
  mavenCentral()
  maven {
    url "https://jaspersoft.jfrog.io/jaspersoft/third-party-ce-artifacts/"
  }
}

この記述により、セントラルリポジトリにない場合は、次に記載したリポジトリを検索すると言うようになります。 使用している Gradle のバージョンによって記述方法が異なりますが、考え方は同じはずです。

Jaspersoft Studio

JasperReports では、テンプレートファイル(jrxml)として帳票レイアウトを作成します。 そのレイアウト作成用のツールとして Jaspersoft Studio を使用します。

Eclipse マーケットプレイスから「Jaspersoft Studio」と検索してインストールしてください。

Spring Boot では、src/main/resourcesに Jasper Reports のテンプレートファイルを配置します。 この記事では、src/main/resrouces/jasperreportsをいうパッケージ構成にしておきます。

ここにテンプレートファイルを作成し、ファイルを開けば Jaspersoft Studio が起動します。 Jaspersoft Studio の使用方法などについてはこの記事では説明しません。

PDF のダウンロード

以下に PDF をダウンロードするサンプルを記載しておきます。 パラメーターやデータソースについては適宜変更してください。 詳細については説明しません。

@RestController
@RequestMapping("/jasper/sample")
public class JasperSampleController {

  @Autowired
  private ApplicationContext context;

  @GetMapping
  public void getJasperSample(HttpServletResponse response) {
    try {
      //テンプレート読み込み
      Resource resource = context.getResource("classpath:jasperreports/sample.jrxml");
      InputStream in = resource.getInputStream();
      JasperReport report = JasperCompileManager.compileReport(in);
      //パラメーター、データソースの設定
      Map<String, Object> params = new HashMap<>();
      JRDataSource dataSource = new JREmptyDataSource();
      //PDFを作成し、レスポンスボディに設定
      JasperPrint print = JasperFileManager.fillReport(report, params, dataSource);
      response.setContentType(MediaType.APPLICATION_PDF_VALUE);
      JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream());
    } catch (IOException | JRException e) {
      //エラー処理
      e.printStackTrace();
    }
  }
}

日本語フォントの設定

JasperReports で日本語を出力するためにはフォントの設定が必要になります。

まず以下サイトよりipaexg.ttfipaexm.ttfをダウンロードし、src/main/resources/fontsに配置します。

IPAex フォント Ver.004.01 | 一般社団法人 文字情報技術促進協議会

次に同パッケージ内にfont.xmlを以下の内容で作成します。

font.xml
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
  <fontFamily name="ipaexg">
    <normal>fonts/ipaexg.ttf</normal>
    <pdfEncoding>Identity-H</pdfEncoding>
    <pdfEmbedded>true</pdfEmbedded>
  </fontFamily>
  <fontFamily name="ipaexm">
    <normal>fonts/ipaexm.ttf</normal>
    <pdfEncoding>Identity-H</pdfEncoding>
    <pdfEmbedded>true</pdfEmbedded>
  </fontFamily>
</fontFamilies>

最後にsrc/main/resources配下にjasperreports_extension.propertiesを以下の内容で作成します。

jasperreports_extension.properties
net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.font=fonts/font.xml

Jaspersoft Studio を使用する場合は、「ウィンドウ > 設定」で設定画面を開き、「Jaspersoft Studio > フォント」からフォントファイル(ttf)を追加します。 追加する際に「PDF Encoding」に「Identity-H」を選択するようにしてください。

あとはテキストのフォントとして追加したフォントを設定すれば OK です。