【Spring Boot】JasperReportsの導入(Gradle)
導入
build.gradle
に以下を追加し、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.gradle
のrepositories
に記載した場所からライブラリを取得します。
環境などにもよるかもしれないのですが、私の場合は以下のようにmavenCentral()
がデフォルトで指定されています。
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
の部分です。
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7.js8</version>
実はこのライブラリ、Maven のセントラルリポジトリには存在しません。 そのため、pom ファイルではこのライブラリがあるリポジトリを以下のように指定してあります。
<repositories>
<repository>
<id>jaspersoft-third-party</id>
<url>https://jaspersoft.jfrog.io/jaspersoft/third-party-ce-artifacts/</url>
</repository>
</repositories>
Maven を使用しているのであれば、ここの情報から依存関係を解決してくれるため、特別設定は必要ありません。
しかし、Gradle の場合はこの記述があっても依存関係を解決してくれません。
あくまでbuild.gradle
のrepositories
に記載されたリポジトリからしかライブラリを検索しません。
一見正しくライブラリが追加されたように見えますが、これが原因で依存関係にあるライブラリが存在しないためClassNotFoundException
となっているということです。
解決策として、build.gradle
のrepositories
に pom ファイルで指定しているリポジトリを以下のように追加します。
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.ttf
とipaexm.ttf
をダウンロードし、src/main/resources/fonts
に配置します。
IPAex フォント Ver.004.01 | 一般社団法人 文字情報技術促進協議会
次に同パッケージ内に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
を以下の内容で作成します。
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 です。