マニュアル一覧PDFで読む

Reports.web Pure Java プログラマーズガイド/APIリファレンス

製品版のライセンス配置と ReportsProductInfo.loadLicense の使い方は、製品版を使い始めるをご覧ください。体験版では登録不要です。

Reports.web Pure Javaは、ブラウザー内のWASMを使わず、Javaだけで帳票を作成・表示・保存・印刷するための帳票エンジンです。

この一冊では、初めて利用する方が次のプログラムを作れるようになることを目標にしています。

Reports.web Pure Javaの全体構成 帳票定義と業務データをPure Javaエンジンへ渡し、ローカルアプリまたはWebアプリケーションからPDF、SVG、画像、印刷、PREPEJを出力する流れ Reports.web Pure Java ブラウザー内WASMを使わず、Javaだけで帳票を作成・保存・配信 帳票の材料 PREPDJ(レイアウト) 業務データ(DB・Java) 文字、数値、明細行、画像 Pure Java 帳票エンジン 1. PREPDJを読み込む 2. 項目名へ値を設定する 3. ページを組み立てて出力する 出力 PDF  SVG  PNG/画像 プリンター  JavaFXプレビュー PREPEJ(再表示・再印刷用) 同じエンジンを2つの場所で利用できます ローカル/デスクトップ バッチ、業務アプリ、JavaFXアプリ • 帳票をその場でプレビュー・印刷 • 夜間処理でPDFを一括作成 • PREPEJを保存して後から再印刷 Web/REST API Spring BootなどのJavaサーバー • ブラウザーから値を受け取りPDFを返す • SVGをWeb画面へ表示する • PREPEJを受け取り再出力する 帳票定義と出力処理を共通化できるため、ローカル用とWeb用で帳票ロジックを作り直す必要はありません。

1. 最初に理解する3つのデータRM001

帳票を作るときは、「レイアウト」と「値」を分けて考えます。

データ Javaの型 内容
帳票定義 ReportDocument 用紙、文字枠、罫線、画像、バーコード、明細の繰返しなどのレイアウト
印刷データ ReportData 顧客名、日付、金額、商品明細など、帳票へ差し込む値
完成した印刷データ PreviewJob 帳票定義と印刷データをページ単位でまとめた、再表示・再印刷可能なデータ

それぞれを保存するファイルは次のとおりです。

拡張子 内容 主な用途
.prepdj JSON形式の帳票定義 デザイナーで作成・編集し、Javaから読み込む
.prepd 従来形式の帳票定義 既存帳票の読み込み、移行、Reports.netへ渡す保存
.prepej 帳票定義と値を含む完成した印刷データ 保存、転送、プレビュー、再印刷
.prepe 従来形式の完成した印刷データ 既存データの読み込み(Reports.netが保存したものを含む)

通常の処理は次の3段階です。

  1. ReportDefinitionIO でPREPDJを読み込む
  2. ReportData に項目値と明細行を設定する
  3. PdfExporter、SvgExporter、ReportRenderer、PrinterOutputのいずれかで出力する

PREPEJは、出力後の帳票を保存・受け渡しするときに使用します。PDFを1枚作るだけなら、最初からPREPEJを作る必要はありません。

2. 開発を始めるRM002

2.1 動作環境RM003

ZIPを展開したら、Native/Pure-Java/samples/01.あっという間に帳票出力 をエディターやIDEで開いてください。ここにはソース、帳票定義、ビルド設定、起動手順が揃っています。最初はこのサンプルを土台にすると、ライブラリの配置で迷わずに始められます。

エンジンと依存ライブラリは Native/Pure-Java/SDK/lib にあります。例えば、この01フォルダーに置いたGradleプロジェクトでは次のように参照します。同梱の build.gradle.kts は、この配置に対応済みです。

dependencies {
    implementation(fileTree("../../SDK/lib") { include("*.jar") })
}

自分のプロジェクトへ移す場合も、エンジンJARだけでなく、ここにある依存JARを一緒に参照します。相対パスは新しいプロジェクトの場所に合わせて変更してください。製品ソースの engine プロジェクトを用意する必要はありません。

2.2 パッケージRM004

通常の帳票出力で使用するパッケージは次の3つです。

パッケージ 役割
com.pao.reports.engine.model 帳票定義、印刷データ、印刷ジョブのモデル
com.pao.reports.engine.io PREPDJ、PREPEJ、値データの読み書き
com.pao.reports.engine.render PDF、SVG、画像、プリンターへの出力

3. 最初の帳票プログラムRM005

同梱の帳票定義を使い、タイトルと会社名を設定してPDFを1ページ作ってみましょう。

  1. Native/Pure-Java/samples/01.あっという間に帳票出力 を開きます。
  2. 元のソースを残したい場合は src/main/java/quickreport/QuickReport.java を別の場所へコピーします。同じソースフォルダーに別名の .java として残すと、クラスが重複するので注意してください。
  3. QuickReport.java の内容を次のコードへ置き換えます。
package quickreport;

import com.pao.reports.engine.io.ReportDefinitionIO;
import com.pao.reports.engine.model.ReportData;
import com.pao.reports.engine.model.ReportDocument;
import com.pao.reports.engine.render.PdfExporter;

import java.nio.file.Files;
import java.nio.file.Path;

public class QuickReport {
    public static void main(String[] args) throws Exception {
        Path root = args.length == 0
                ? Path.of("").toAbsolutePath() : Path.of(args[0]).toAbsolutePath();
        Path definitionFile = root.resolve("definition/quick-report.prepdj");
        Path outputFile = root.resolve("output/first-report.pdf");
        Files.createDirectories(outputFile.toAbsolutePath().getParent());

        // 帳票のレイアウトを読み込む
        ReportDocument definition =
                new ReportDefinitionIO().read(definitionFile);

        // 帳票へ差し込む値を設定する
        ReportData data = new ReportData();
        data.values.put("Title", "はじめてのJava帳票");
        data.values.put("CustomerName", "株式会社サンプル");

        // この見本では、オブジェクト名と値のキーを結び付けます。
        for (var object : definition.objects) {
            if (data.values.containsKey(object.name)) object.binding = object.name;
        }

        // PDFを作る
        new PdfExporter().export(definition, data, outputFile);
        System.out.println("PDFを作成しました: " + outputFile);
    }
}
  1. 01フォルダーのターミナルから、Windowsでは .\run.cmd、macOS/Linuxでは bash ./run.sh を実行します。詳しいJDKの準備は、01のREADMEをご覧ください。
  2. 作成された output/first-report.pdf を開き、タイトルと会社名を確認します。文字列を変えてもう一度実行すると、同じPDFを更新できます。

この例はPDFだけを作ります。PREPEJ・ページ単位SVGも作る元の01とは、出力ファイルが異なります。

data.values のキーは、文字オブジェクトの binding(連結する項目)と対応します。この見本ではコードでその対応を設定しています。自作の定義で既に binding を設定してあれば、上の for 文は不要です。

以降は機能別のコード例です。第3章のような単独実行プログラムではなく、使用中の定義・データ・接続先に合わせて組み込む部分を示します。請求書の明細やDB取得を含む動く実装は、02~04のサンプルと併せて確認してください。

4. 印刷データを設定するRM006

4.1 1帳票に1つの値を設定するRM007

顧客名、伝票番号、発行日、合計金額のような値は values に設定します。

ReportData data = new ReportData();
data.values.put("伝票番号", "INV-2026-0012");
data.values.put("顧客名", "株式会社サンプル");
data.values.put("発行日", LocalDate.of(2026, 9, 14));
data.values.put("合計金額", 120000);

値には文字列だけでなく、数値、真偽値、日付なども渡せます。画面へ表示される形式を固定したい場合は、業務プログラム側で文字列へ整形してから設定してください。

NumberFormat money = NumberFormat.getNumberInstance(Locale.JAPAN);
data.values.put("合計金額", money.format(120000) + " 円");

4.2 明細行を設定するRM008

商品一覧のように同じレイアウトを繰り返す値は、1行を Map<String, Object> として rows へ追加します。

Map<String, Object> row1 = new LinkedHashMap<>();
row1.put("商品名", "商品A");
row1.put("数量", 2);
row1.put("単価", 50000);
data.rows.add(row1);

Map<String, Object> row2 = new LinkedHashMap<>();
row2.put("商品名", "商品B");
row2.put("数量", 1);
row2.put("単価", 20000);
data.rows.add(row2);

帳票定義側で繰返しが設定されたオブジェクトには、rows の各行が順番に割り当てられます。1ページに収まらない場合は、エンジンが必要なページ数を計算します。

4.3 DBの検索結果から明細を作るRM009

try (PreparedStatement statement = connection.prepareStatement(
        "select product_name, quantity, unit_price from invoice_line where invoice_id = ?")) {
    statement.setLong(1, invoiceId);

    try (ResultSet result = statement.executeQuery()) {
        while (result.next()) {
            Map<String, Object> row = new LinkedHashMap<>();
            row.put("商品名", result.getString("product_name"));
            row.put("数量", result.getInt("quantity"));
            row.put("単価", result.getBigDecimal("unit_price"));
            data.rows.add(row);
        }
    }
}

SQL列名を帳票項目名と直接結び付けず、row.put(...) の箇所で明示的に対応付けると、DB変更の影響を帳票へ持ち込みにくくなります。

4.4 印刷時だけ位置や色を変更するRM010

帳票定義を変更せず、今回の印刷だけオブジェクトの表示、位置、色などを変えることもできます。キーは @オブジェクト名.プロパティ名 の形式です。

data.values.put("@合計金額.Bold", true);
data.values.put("@社内控え.Visible", false);
data.values.put("@タイトル.FontSize", 18);

明細行ごとに指定すれば、その行に対応する繰返しオブジェクトだけを変更できます。

Map<String, Object> row = new LinkedHashMap<>();
row.put("商品名", "特別値引き");
row.put("@商品名.Bold", true);
row.put("@商品枠.StrokeColor", "#CC0000");
data.rows.add(row);

指定できる主な動的プロパティは次のとおりです。先頭の @ は省略できますが、通常の項目名と区別しやすいため付けることを推奨します。

分類 プロパティ名
位置・大きさ X、Y、Width、Height、Angle/Rotation
表示・値 Visible、Text/Value
文字 FontFamily/FontName、FontSize、Bold、HorizontalAlignment、VerticalAlignment
塗り FillColor、FillEnabled、FillStyle、HatchDensity
線・枠 StrokeColor、StrokeWidth、StrokeStyle、DashPattern、LineType、TextBorderEnabled

動的プロパティは一時的な出力変更です。元の ReportDocument やPREPDJは変更されません。

5. ローカルアプリケーションで出力するRM011

5.1 PDFを作るRM012

標準のPDF出力は次の1行です。

new PdfExporter().export(definition, data, Path.of("output", "invoice.pdf"));

この呼び出しは、互換性を重視した100 DPIのイメージPDFを作ります。

文字を検索できるベクターPDFを作る場合は、使用するフォントファイルを明示します。

List<Path> fonts = List.of(
        Path.of("fonts", "NotoSansJP-Regular.ttf"),
        Path.of("fonts", "NotoSansJP-Bold.ttf"));

PdfExporter.Result result = new PdfExporter().export(
        definition,
        data,
        Path.of("output", "invoice-vector.pdf"),
        PdfExporter.Options.vector(150, fonts),
        RenderControl.none());

result.diagnostics().forEach(System.out::println);

ベクターPDFで利用できない文字は、読めない文字へ置き換えず輪郭として出力され、diagnostics() に診断情報が返ります。その文字は表示できますが、PDF内検索の対象にはなりません。

5.2 SVGを作るRM013

1ページだけをSVGファイルへ保存します。

new SvgExporter().export(
        definition, data, Path.of("output", "invoice.svg"));

複数ページをページ別のSVGへ保存します。

List<Path> files = new SvgExporter().exportPages(
        definition, data, Path.of("output", "svg"), "invoice");

SVG文字列をWebレスポンスへ直接返す場合は svg(...) を使います。

String svg = new SvgExporter().svg(definition, data, 0);

ページ番号は0から始まります。最初のページは 0 です。

5.3 BufferedImageを作るRM014

BufferedImage image = new ReportRenderer().render(
        definition, data, RenderOptions.preview());

ImageIO.write(image, "png", Path.of("output", "invoice.png").toFile());
image.flush();

render(...) は先頭ページを返します。全ページが必要な場合は renderPages(...) を使用します。

List<BufferedImage> pages = new ReportRenderer().renderPages(
        definition, data, RenderOptions.preview());

大量ページを一度にメモリーへ置きたくない場合は、pageCount(...) でページ数を取得し、renderPage(...) を1ページずつ呼び出します。

ReportRenderer renderer = new ReportRenderer();
int count = renderer.pageCount(definition, data);

for (int page = 0; page < count; page++) {
    BufferedImage image = renderer.renderPage(
            definition, data, RenderOptions.preview(), page, RenderControl.none());
    try {
        ImageIO.write(image, "png",
                Path.of("output", "page-" + (page + 1) + ".png").toFile());
    } finally {
        image.flush();
    }
}

5.4 プリンターへ印刷するRM015

印刷ダイアログを表示して印刷します。

new PrinterOutput().print(definition, data, true);

ダイアログを表示せず、既定のプリンターへ送る場合は第3引数を false にします。

既存の印刷処理へ組み込む場合は Pageable を取得します。

Pageable pages = new PrinterOutput().createPageable(definition, data);

5.5 デスクトップでプレビューするRM016

製品付属のJavaFXプレビュアーは、ReportRenderer のページ画像を使用します。独自画面へ組み込む場合も、renderPage(...) で必要なページだけを描画し、SwingFXUtils.toFXImage(...) でJavaFX画像へ変換できます。

BufferedImage buffered = new ReportRenderer().renderPage(
        definition, data, RenderOptions.preview(), pageIndex, RenderControl.none());
WritableImage fxImage = SwingFXUtils.toFXImage(buffered, null);
imageView.setImage(fxImage);
buffered.flush();

ページ移動時には pageIndex を変更して再描画します。最初のページは0、最後のページは pageCount(...) - 1 です。

5.6 デスクトップの操作UIを外側から隠すRM017

02/04 Clientに同梱した SamplePreviewWindow のソースを利用する場合は、JavaFXのUIスレッドから次のように操作できます。

var preview = new SamplePreviewWindow(owner, "帳票", definition, data);
preview.setPreviewChromeVisible(false); // 帳票だけにする
preview.show();
// アプリ側の再表示ボタンから呼び出します。
preview.setPreviewChromeVisible(true);  // メニュー・全ツールバー・ステータス・ページ一覧を表示

通常の初期表示は変わりません。これは同梱サンプルWindowの公開メソッドであり、帳票エンジンSDKが独立したUIコントロールを提供する、という意味ではありません。OSのウィンドウ枠は残ります。Web用の ReportsWebNative や、そのPDF・検索APIとは別のものです。

6. 完成した帳票をPREPEJへ保存するRM018

PREPEJは、各ページの帳票定義と印刷データをまとめた自己完結ファイルです。元のPREPDJやDBへ接続しなくても、PREPEJだけで同じ帳票を再表示・再印刷できます。

6.1 PREPEJを作るRM019

PreviewJob job = new PreviewJob();
job.name = "請求書 INV-2026-0012";

ReportRenderer renderer = new ReportRenderer();
int pageCount = renderer.pageCount(definition, data);

for (int pageIndex = 0; pageIndex < pageCount; pageIndex++) {
    job.pages.add(new PreviewJob.Page(definition, data, pageIndex));
}

new PreviewJobIO().write(
        Path.of("output", "invoice.prepej"), job);

sourcePage は、元の帳票定義と印刷データの何ページ目を表示するかを示す0始まりの番号です。

6.2 PREPEJを読み、PDFへ再出力するRM020

PreviewJobIO.ReadResult loaded =
        new PreviewJobIO().read(Path.of("output", "invoice.prepej"));

if (!loaded.selfContained()) {
    throw new IOException("帳票定義を含むPREPEJではありません");
}

List<PdfExporter.Page> pages = loaded.job().pages.stream()
        .map(page -> new PdfExporter.Page(
                page.definition, page.data, page.sourcePage))
        .toList();

new PdfExporter().exportPages(
        pages,
        Path.of("output", "invoice-reprint.pdf"),
        PdfExporter.Options.image(),
        RenderControl.none());

selfContained() が true なら、そのファイルだけで出力できます。従来の値データだけを読み込んだ場合は false になり、legacyData() に値が返ります。その場合は別途PREPD/PREPDJが必要です。

6.3 値だけを保存するRM021

ReportDataIO は values と rows だけを保存します。帳票定義を含まないため、このファイルだけではプレビューや印刷はできません。

ReportDataIO dataIO = new ReportDataIO();
dataIO.write(Path.of("work", "invoice-data.json"), data);

ReportData restored =
        dataIO.read(Path.of("work", "invoice-data.json"));

一時保存、テストデータ、サーバー内部の受け渡しには ReportDataIO、利用者へ渡す再表示・再印刷用ファイルには PreviewJobIO を使用します。

7. Webアプリケーションで使うRM022

Pure Javaエンジンは、Spring Boot、Jakarta EE、Servletなどのサーバー側Javaから利用できます。ブラウザーへJavaエンジンを配布する方式ではありません。サーバーで帳票を作り、PDF、SVGまたはPREPEJをHTTPレスポンスとして返します。

7.1 業務データを受け取りPDFを返すRM023

次のSpring Boot例では、帳票定義をサーバーに置き、リクエストで受け取った値を設定してPDFを返します。

@RestController
@RequestMapping("/api/invoices")
public class InvoiceController {
    private final ReportDocument invoiceDefinition;

    public InvoiceController() throws IOException {
        invoiceDefinition = new ReportDefinitionIO().read(
                Path.of("reports", "invoice.prepdj"));
    }

    @PostMapping(value = "/pdf", produces = MediaType.APPLICATION_PDF_VALUE)
    public ResponseEntity<byte[]> createPdf(
            @RequestBody InvoiceRequest request) throws Exception {

        ReportData data = new ReportData();
        data.values.put("顧客名", request.customerName());
        data.values.put("請求日", request.invoiceDate());
        data.values.put("合計金額", request.total());

        for (InvoiceLine line : request.lines()) {
            Map<String, Object> row = new LinkedHashMap<>();
            row.put("商品名", line.productName());
            row.put("数量", line.quantity());
            row.put("単価", line.unitPrice());
            data.rows.add(row);
        }

        Path temporary = Files.createTempFile("invoice-", ".pdf");
        try {
            new PdfExporter().export(invoiceDefinition, data, temporary);
            byte[] body = Files.readAllBytes(temporary);

            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION,
                            "inline; filename=invoice.pdf")
                    .contentType(MediaType.APPLICATION_PDF)
                    .body(body);
        } finally {
            Files.deleteIfExists(temporary);
        }
    }
}

公開APIでは、入力項目、文字数、明細件数、出力ページ数を検証してください。クライアントから任意のファイルパスやURLを受け取り、画像として読み込ませないでください。

7.2 SVGをWeb画面へ表示するRM024

@GetMapping(value = "/{id}/svg", produces = "image/svg+xml")
public ResponseEntity<String> createSvg(
        @PathVariable long id,
        @RequestParam(defaultValue = "0") int page) {

    ReportData data = invoiceService.createReportData(id);
    int pageCount = new ReportRenderer().pageCount(invoiceDefinition, data);
    if (page < 0 || page >= pageCount) {
        return ResponseEntity.badRequest().build();
    }

    String svg = new SvgExporter().svg(invoiceDefinition, data, page);
    return ResponseEntity.ok()
            .contentType(MediaType.parseMediaType("image/svg+xml"))
            .body(svg);
}

ブラウザー側では、通常の画像と同様にエンドポイントを表示できます。

<img src="/api/invoices/123/svg?page=0" alt="請求書プレビュー">

SVGへ含めるデータはHTMLと同様に信頼境界を意識し、認証・認可と入力検証を行ってください。

7.3 PREPEJをREST APIで受け取るRM025

クライアントが完成済みPREPEJを持っている場合は、PreviewJobIO で読み込み、各ページをPDFやSVGへ出力できます。

Path upload = Files.createTempFile("report-", ".prepej");
try {
    Files.write(upload, requestBody);
    PreviewJobIO.ReadResult loaded = new PreviewJobIO().read(upload);

    if (!loaded.selfContained()) {
        throw new IllegalArgumentException("自己完結PREPEJが必要です");
    }

    PreviewJob job = loaded.job();
    PreviewJob.Page first = job.pages.get(0);
    String svg = new SvgExporter().svg(
            first.definition, first.data, first.sourcePage);
} finally {
    Files.deleteIfExists(upload);
}

アップロードサイズ、ページ数、項目数を制限し、一時ファイルは必ず削除してください。PDF生成には同時実行数、処理時間、キャンセルの上限を設けることを推奨します。

7.4 アプリ側からプレビュアーを操作するRM026

帳票だけを業務画面に置き、PDFや検索は自分のアプリのボタンから操作したい場合に使うインターフェースです。ツールバーを隠しても、プレビュアーの機能は停止しません。 設定ボタンまで隠せるため、再表示用のボタンはプレビュアーの外側に置きます。

03「全帳票をWebでプレビュー」と公開デモは、この使い方の実例です。最初はプレビューだけを表示し、帳票選択の横の「ツールバーを表示」を押すとPDF・検索・設定などを表示します。もう一度押すと、設定ボタンとステータスも含めて非表示になります。

表示・非表示を切り替えるコード

以下は03サンプルのプレビュアーを読み込んだ後に置く、アプリ側のコードです。サンプルの native-previewer.js、native-previewer.css、画面の初期化部分を一緒に利用してください。03を編集する場合は、既存の同じボタン・切り替え処理を置き換え、二重に追加しないでください。

<!-- プレビュアーの外側に置くアプリ側のボタン -->
<button type="button" id="togglePreviewToolbar"
        aria-controls="nativePreviewer" aria-expanded="false">
  ツールバーを表示
</button>
// native-previewer.js の読み込み後に実行します。
const previewer = window.ReportsWebNative;
const button = document.getElementById("togglePreviewToolbar");

function updateButton() {
  const visible = previewer.getState().chrome.toolbar;
  button.textContent = visible
    ? "ツールバーを非表示" : "ツールバーを表示";
  button.setAttribute("aria-expanded", String(visible));
}

button.addEventListener("click", () => {
  if (previewer.getState().chrome.toolbar) previewer.hideAll();
  else previewer.showAll();
});
const unsubscribe = previewer.subscribe("chrome-changed", updateButton);

previewer.hideAll(); // 初期画面は帳票だけ
updateButton();
// アプリ側の画面を破棄する場合は unsubscribe() で購読を解除します。

03サンプルでは、プレビュアーを初期化する前の ReportsNativeConfig に externalChromeControl: true を指定しています。この設定では、内部設定から全非表示にした場合も、設定を戻すための小さなボタンをプレビュアー内に残しません。必ず上のような外部ボタンを用意してください。chrome-changed を購読すると、内部設定から切り替えた場合も外部ボタンの文字が追従します。

ツールバーがなくても、PDF・検索・ページ移動を使える

await previewer.showPdfPreview(); // サーバーへPDFを要求し、同じ表示領域へ表示
await previewer.showSvgPreview(); // 通常の印刷プレビューへ戻る
previewer.goToPage(2);            // ページ番号は1から
previewer.setZoom("auto");       // 表示領域に合わせた倍率
previewer.search("請求");         // 通常の印刷プレビュー内を検索

ここでの showSvgPreview() はAPI名であり、利用者に見せるボタン名は「印刷プレビュー」で構いません。PDF表示中の検索などはブラウザー内蔵PDFビューアーの機能と区別します。非表示のままPDF表示へ切り替えることもできます。プレビューを最初に開いただけではPDFを要求しません。

API 用途・注意
hideAll() 設定・ステータスを含む操作UIを一括非表示にする。開いている設定ダイアログも閉じる
showAll() 全コマンドを表示する。以前の個別表示設定を復元する操作ではない
getState() 現在のページ・倍率・表示設定などの状態を取得する
subscribe("chrome-changed", handler) 表示設定の変更を受け取る。戻り値は購読解除用関数
setChrome({commands: {print: false}}) 印刷など特定のコマンドだけを隠す
showPdfPreview() / showSvgPreview() PDF表示/通常プレビューへ切り替える。切り替え処理は await で待てるが、ブラウザー内蔵PDFビューアーの読込完了を保証するものではない
print() / savePrintData() / openPrintData() 印刷・PREPEJ保存・PREPEJを開く。自分のボタンのクリックから呼び出す

非表示の対象はReports.webの操作UIです。PDF表示中にブラウザー内蔵PDFビューアーが表示する独自のボタンは、このAPIの制御対象ではありません。

このインターフェースは、3つのNative Webサンプルで使うブラウザー側の ReportsWebNative です。サーバーの帳票エンジンのクラスや、デスクトップ用Windowとは別です。WASM版にも一括表示・非表示の機能がありますが、初期化方法やAPIの所属はWASM版のガイドを参照してください。

8. 実行の中止と進捗通知RM027

時間のかかるPDFや画像の生成には RenderControl を渡せます。

AtomicBoolean cancelled = new AtomicBoolean(false);

RenderControl control = new RenderControl(
        cancelled::get,
        progress -> System.out.printf("%.0f%%%n", progress * 100));

new PdfExporter().export(
        definition,
        data,
        Path.of("output", "large-report.pdf"),
        PdfExporter.Options.image(150),
        control);

中止条件が true になると CancellationException が送出されます。Webアプリケーションでは、クライアント切断やタイムアウトと連携できます。

9. 帳票定義を変換・保存するRM028

通常の帳票出力ではPREPDJを読み込むだけです。この章は、Javaで帳票定義自体を編集・変換する場合に使用します。

9.1 帳票定義を保存するRM029

ReportDefinitionIO definitionIO = new ReportDefinitionIO();
ReportDocument definition = definitionIO.read(Path.of("invoice.prepdj"));

definition.title = "請求書(社内控え)";
definitionIO.write(Path.of("invoice-copy.prepdj"), definition);

ReportDefinitionIO.write(...) は帳票定義の保存です。帳票項目へ印刷値を設定するメソッドではありません。値は ReportData.values と ReportData.rows に設定します。

9.2 読み込み時の診断を確認するRM030

従来形式の帳票定義には、Pure Javaモデルへ完全に対応付けられない設定が含まれる場合があります。移行確認では readWithDiagnostics(...) を使います。

ReportDefinitionIO.ReadResult result =
        new ReportDefinitionIO().readWithDiagnostics(
                Path.of("legacy-report.prepd"));

ReportDocument definition = result.document();

for (ReportDefinitionIO.ReadDiagnostic diagnostic : result.diagnostics()) {
    System.out.printf("%s %s: %s%n",
            diagnostic.code(), diagnostic.path(), diagnostic.message());
}

診断情報は「読み込みに失敗した」という意味ではありません。互換情報として保持した設定や、同じ見た目を保証できない設定を、移行担当者が確認するための情報です。新しく作成したPREPDJを通常利用する場合は read(...) で構いません。

9.3 JSON文字列として扱うRM031

ReportDefinitionIO definitionIO = new ReportDefinitionIO();

String json = definitionIO.toJson(definition);
ReportDocument restored = definitionIO.fromJson(json);

toJson(...) と fromJson(...) が扱うのは、帳票定義 ReportDocument です。印刷データやPREPEJではありません。

10. APIリファレンスRM032

ここからは、プログラム作成中にクラス、メソッド、プロパティを調べるためのリファレンスです。

10.1 ReportDefinitionIORM033

PREPD/PREPDJの読み書きを行います。

メソッド 戻り値 説明
read(Path path) ReportDocument ファイル名の拡張子を判定し、帳票定義を読み込む
read(InputStream input, String sourceName) ReportDocument ストリームから読み込む。sourceNameには形式判定可能なファイル名を渡す
readWithDiagnostics(...) ReadResult 帳票定義に加え、互換性に関する診断情報を返す
write(Path path, ReportDocument document) void 拡張子に応じて帳票定義を保存する。.prepd はReports.netで開いて出力できる従来形式で書く
writeCanonical(Path path, ReportDocument document) WriteResult 標準PREPDJとして保存し、未解決の互換性情報を返す
toJson(ReportDocument document) String 帳票定義をJSON文字列へ変換する
fromJson(String value) ReportDocument JSON文字列から帳票定義を復元する

ReadResult のプロパティ:

プロパティ 型 説明
document() ReportDocument 読み込んだ帳票定義
diagnostics() List<ReadDiagnostic> 互換性に関する診断一覧

ReadDiagnostic のプロパティ:

プロパティ 説明
code() 診断を識別するコード
path() 対象となった帳票定義内の位置
message() 診断内容

10.2 ReportDataRM034

帳票へ差し込む値を保持します。

プロパティ 型 説明
values Map<String, Object> 帳票全体で使用する項目名と値
rows List<Map<String, Object>> 繰返し明細。リストの1要素が1行

10.3 ReportDataIORM035

帳票定義を含まない、値だけのデータを読み書きします。

メソッド 戻り値 説明
read(Path path) ReportData 値データを読み込む
write(Path path, ReportData data) void 値データを保存する

10.4 PreviewJobIORM036

完成した印刷データであるPREPE/PREPEJを読み書きします。

メソッド 戻り値 説明
read(Path path) ReadResult PREPE/PREPEJを読み込む。Reports.netの .prepe(SaveXMLFile のXML、SaveData の圧縮形式)も読む
write(Path path, PreviewJob job) void 帳票定義と値を含む印刷ジョブを保存する

ReadResult のプロパティ:

プロパティ 説明
selfContained() 帳票定義を含み、そのファイルだけで表示・印刷できる場合は true
job() 自己完結形式を読み込んだ場合の PreviewJob
legacyData() 従来の値だけの形式を読み込んだ場合の ReportData
diagnostics() PREPEJ読み込み時の診断一覧

10.5 PreviewJobRM037

プロパティ 型 説明
name String 印刷ジョブの表示名
pages List<PreviewJob.Page> 表示・印刷するページの一覧
canonicalSourceJson String 読み込んだ標準PREPEJの原文を互換性維持のため保持する領域。通常は変更しない
diagnostics List<String> 読み込み・変換時の診断情報

PreviewJob.Page:

プロパティ 型 説明
definition ReportDocument このページで使う帳票定義
data ReportData このページで使う印刷データ
sourcePage int 元の帳票のページ番号。0始まり

10.6 PdfExporterRM038

メソッド 説明
export(definition, data, target) 全ページを標準設定のイメージPDFへ出力する
export(definition, data, target, options, control) PDF方式、解像度、フォント、中止・進捗を指定して出力する
exportPages(pages, target, options, control) 異なる帳票定義を含むページ一覧を1つのPDFへ出力する

PdfExporter.Options:

作成方法 説明
Options.image() 100 DPIのイメージPDF
Options.image(dpi) 指定DPIのイメージPDF
Options.vector(dpi, fontFiles) 指定したローカルフォントを使用するベクターPDF

PdfExporter.Result:

プロパティ 説明
mode() 実際に使用した IMAGE または VECTOR
pages() 出力ページ数
renderingDpi() 描画に使用したDPI
diagnostics() フォントなどの診断情報

10.7 SvgExporterRM039

メソッド 戻り値 説明
export(document, data, target) void 先頭ページをSVGファイルへ保存する
export(document, data, target, rasterDpi) void SVG内で画像化される要素のDPIを指定して保存する
svg(document, data) String 先頭ページのSVG文字列を返す
svg(document, data, pageIndex) String 指定ページのSVG文字列を返す
exportPages(document, data, directory, prefix) List<Path> 全ページを別々のSVGファイルへ保存する

10.8 ReportRendererRM040

メソッド 戻り値 説明
render(document, data, options) BufferedImage 先頭ページを画像化する
render(document, data, options, control) BufferedImage 中止・進捗通知を指定して画像化する
renderPages(document, data, options) List<BufferedImage> 全ページを画像化する
renderPages(document, data, options, control) List<BufferedImage> 中止・進捗通知を指定して全ページを画像化する
pageCount(document, data) int 明細の繰返しを含めたページ数を返す
renderPage(document, data, options, pageIndex, control) BufferedImage 指定ページだけを画像化する
paintPage(graphics, document, data, dpi, page, control) void 呼び出し側が用意した Graphics2D へ直接描画する

RenderOptions:

プロパティ 説明
dpi 描画解像度
transparent 背景を透明にするか
pageIndex 対象ページ番号。0始まり
preview() 144 DPI、不透明背景のプレビュー設定
print() 100 DPI、不透明背景の互換印刷設定

10.9 PrinterOutputRM041

メソッド 説明
print(definition, data, showDialog) 印刷ダイアログの有無を指定してプリンターへ出力する
createPageable(definition, data) Java印刷APIで使用できる Pageable を返す
createPageable(pages) 複数の帳票定義を含むページ一覧から Pageable を作る

10.10 RenderControlRM042

メンバー 説明
new RenderControl(cancelled, progress) 中止判定と進捗通知を指定する
none() 中止・進捗通知を使用しない設定
checkpoint() 中止が要求されていれば CancellationException を送出する
progress(double value) 0~1の進捗を通知する

11. 帳票モデルのプロパティRM043

通常はデザイナーでPREPDJを作成するため、Javaからこれらを直接設定する必要はありません。帳票定義を動的に変更する場合や、独自デザイナーを作る場合に参照してください。

11.1 ReportDocumentRM044

プロパティ 型 説明
format String 帳票形式名
formatVersion int 帳票形式のバージョン
title String 帳票名
paperSize String 用紙名。A3、A4、A5、B4、B5、Postcard(はがき)、CUSTOM など。向きは widthMm・heightMm の大小で表す
widthMm, heightMm double 用紙の幅と高さ。単位はmm
gridMm double デザイナーのグリッド間隔。単位はmm
designScalePercent double デザイナーの表示倍率
showGrid boolean グリッドを表示するか
snapToGrid boolean オブジェクトをグリッドへ合わせるか
objectsLocked boolean 帳票全体のオブジェクトをロックするか
defaultFontFamily String 新規文字オブジェクトの既定フォント
defaultFontSizePt double 新規文字オブジェクトの既定サイズ
isInch boolean 用紙サイズの編集表示をインチにする。内部の寸法はmmのまま
designColor String 新規オブジェクトの文字・線の既定色。背景色ではない
defaultStrokeWidth, defaultStrokeStyle, defaultDashPattern 線幅・線種・破線 新規オブジェクトの既定線設定
displayRepeatObjects, repeatObjectColor 表示・色 デザイナーの繰返し補助表示。印刷内容には加えない
backgroundX, backgroundY, backgroundWidth, backgroundHeight double 帳票背景画像の位置・寸法。mm。幅・高さ0は用紙寸法
backgroundImagePath, backgroundImageDataBase64 String 帳票背景画像のファイルまたは埋込データ
backgroundImageSizeMode, backgroundImagePosition String 帳票背景画像のサイズ方法・配置位置
objects List<ReportObject> 帳票に配置されたオブジェクト
extensions Map<String, Object> 互換性維持用の拡張情報。通常は変更しない
copy() ReportDocument 帳票定義の複製を作る

11.2 ReportObject 共通プロパティRM045

プロパティ 説明
id オブジェクトを識別するID
name デザイナー上の項目名
type TEXT、IMAGE、BARCODE、LINE、RECTANGLE、ELLIPSE
x, y 配置位置。単位はmm
width, height 幅と高さ。単位はmm
rotation 回転角度
visible 出力するか
locked デザイナーで編集を禁止するか
binding ReportData のキーと結び付ける項目名
repeat, repeatX 縦方向、横方向の繰返し数
intervalX, intervalY 繰返し間隔。単位はmm
repeatXYBoth 縦横の格子状に繰り返すか
extensions 互換性維持用の拡張情報。通常は変更しない
copy() オブジェクトの複製を作る

11.3 文字プロパティRM046

プロパティ 説明
text 値が指定されない場合に表示する固定文字
fontFamily フォントファミリー名
fontSizePt 文字サイズ。実際の単位は fontUnit に従う
fontUnit 文字サイズ単位。通常は Point。従来の World、Display、Pixel、Inch、Document、Millimeter も出力解像度に合わせて換算
bold, italic, underline, strikeout 太字、斜体、下線、取消線
horizontalAlignment LEFT、CENTER、RIGHT
verticalAlignment TOP、MIDDLE/CENTER、BOTTOM
textVertical 縦書き。枠に入りきらないとき、プレビュー・印刷では列に折り返し、PDFでは枠の下へはみ出す(Reports.netと同じ)
textElastic 文字を枠へ合わせる
fixingFontHeight フォント高さを固定する
elasticOverCharacters, elasticOverBytes 指定文字数・バイト数を超えたときだけ伸縮する。0は条件なし
justify 通常文字を均等割り付けする
justifyHalfWidth, justifyHalfWidthKana 半角英数字・半角カナを均等割り付けの対象にする
justifyExcludedCharacters 指定文字の連続部分を一まとまりとして扱う
autoJustifyEnds, endSpaceCount 両端の自動空白・指定数の空白
pdfAutoWrap, pdfClipOverflow PDFでの自動折返し・高さによる切取り。折返しはReports.netと同じく半角1・全角2で数えた字数で行う。切取りは高さだけで、横へははみ出す
pdfFontFamily PDF出力に使用する専用フォント。空文字は通常フォント
textColor #RRGGBB 形式、または透明度付きの #AARRGGBB 形式の文字色
textBorderEnabled 文字枠を表示するか
textOutlineWidth, textOutlineColor 文字の輪郭幅と色

伸縮はtextElastic=trueで有効になります。しきい値と同じ長さでは通常表示し、超えた場合だけ伸縮します。文字数はUTF-16の単位数、バイト数は従来のReports.NETに合わせたCP932で数えます。文字数とバイト数は選択して使い、デザイナーでは一方を設定すると他方を解除します。通常の伸縮は縦横を枠に合わせ、高さ固定では指定フォントの高さを保ったまま横方向を合わせます。

11.4 線・図形・塗りのプロパティRM047

プロパティ 説明
strokeColor 線色
strokeWidth 線幅
strokeStyle 線種
dashPattern 独自の破線パターン
lineThickness 円弧などの形状を決める線パラメーター
lineType 単線・二重線などの線種情報
fillEnabled 塗りを有効にするか
fillStyle None、Solid、Hatch
fillColor 塗り色
hatchDensity ハッチの密度
cornerRadius 矩形の角丸半径
cornerTopLeft ほか 四隅ごとの角形状

11.5 画像プロパティRM048

プロパティ 説明
imagePath 画像ファイルのパス
imageDataBase64 Base64形式で埋め込んだ画像
imageSizeMode 画像の拡大・縮小方法
imageAlignment 枠内の配置位置
imageReverse 左右・上下の反転
imageBorderEnabled 画像枠を表示するか

Webサーバーでは、外部入力をそのまま imagePath として使用しないでください。アプリケーションが管理するファイルまたは検証済みの埋め込み画像に限定します。

11.6 バーコードプロパティRM049

プロパティ 説明
barcodeKind CODE128、QR_CODEなどのバーコード種別
barcodeDrawMode STRETCH または DIRECT
barcodeTextVisible バーコード下の文字を表示するか
barcodeJustify バー幅を枠へ合わせるか
barcodeEvenSpacing 文字間隔を均等にするか
barcodeBlackBarAdjusterByDot 黒バー幅のドット補正。単位は出力先の 1 ドット(PDF では 1/600 インチ、画面では 1 ピクセル)
barcodeImageMargin 画像余白
barcodeStartStop スタート/ストップ文字を表示するか
barcodeCodeSet CODE128などのコードセット
qrErrorCorrection QRコードの誤り訂正レベル
qrVersion QRコードの型番
stringEncoding 文字エンコーディング
pdf417Rows, pdf417Columns PDF417の行数と列数
barcodeWhiteBarAdjustment 対応するGS1系バーコードの白バー補正
barcodeTextFontFamily, barcodeTextFontSizePt バーコード下の文字の専用フォント・サイズ。空文字・0は通常フォントを使用
postalCustomerPoint 郵便カスタマバーコードのポイント指定
dataMatrixCodeSize DataMatrixのコードサイズ
pdf417SizeKind, pdf417AspectRatio PDF417のサイズ決定方法・縦横比
pdf417ErrorLevel, pdf417AutoErrorLevel PDF417の誤り訂正レベル・自動設定

11.7 特定ページ・行・項目だけを変更するRM050

ReportPageBuilderは、帳票定義をコピーし、1ページ分の繰返しを展開してから、指定した項目の属性を変更するためのクラスです。フォント専用ではなく、文字色、位置、罫線、表示・非表示など、通常のReportObject属性を変更できます。

var pages = new java.util.ArrayList<ReportDocument>();
for (int pageNumber = 1; pageNumber <= 3; pageNumber++) {
    var builder = new ReportPageBuilder(definition);
    if (pageNumber == 2) {
        // オブジェクト名が「金額」の5行目だけを変更します。行番号は0始まりです。
        var target = builder.object("金額", 4);
        target.fontSizePt = 12;
        target.fontUnit = "Point";
        target.textColor = "#0000FF";
    }
    pages.add(builder.build());
}

ReportPageBuilderとReportDocumentはcom.pao.reports.engine.modelにあります。この例では、definitionに「金額」という名前の項目があり、1ページ内で5行以上繰り返す設定になっているものとします。build()したページは独立したコピーです。後からBuilderを変更しても、元の定義、生成済みのページ、別ページには反映されません。

指定方法 対象
builder.object("金額") 最初の1件
builder.object("金額", 4) 5行目の1件
builder.cell("ラベル", 1, 2) XY繰返しの2列目・3行目の1件

名前の重複、存在しない項目、範囲外の行・列はエラーになります。XY繰返しにはcell()を使用してください。生成した各ページはPdfExporter.Pageに渡し、exportPages()で1つのPDFにまとめられます。

12. フォント、性能、安全性RM051

フォントRM052

帳票で指定したフォントが実行環境にない場合は代替フォントが使われ、文字幅や改行位置が変わることがあります。開発PCだけでなく、本番サーバーにも使用フォントを配置して確認してください。

MS ゴシックがない環境での動作

MS ゴシック(MS Gothic、MS-Gothic)を指定した場合は、指定フォントを優先します。使えない場合は既存の等幅代替フォントを順に探し、それも使えない場合に、Javaエンジンに同梱した BIZ UDゴシック(比例幅のBIZ UDPゴシックではありません)を使用します。利用者による追加インストールやインターネットからの取得は不要です。WindowsでMS ゴシックが使える場合は、従来どおりMS ゴシックを使用します。

この代替はMS ゴシック系の指定に限ります。MS Pゴシック・明朝体・未知のフォントに一律適用するものではなく、同梱フォントにない文字には従来の字形代替処理を使用します。標準・太字には同梱の各書体を使い、斜体はJavaの合成表示です。元のMS ゴシックと字形・文字幅が完全に同一とは限らないため、使用する帳票のプレビューとPDFを確認してください。

同梱フォントとPDFへの埋込みは別です。 フォントがエンジンに同梱されていても、PDFへ自動的に埋め込まれるわけではありません。画像PDFの本文は画像です。ベクターPDFでは、フォントファイルを指定しない場合は文字を輪郭として描画し、その文字は検索・抽出できません。同梱BIZ UDゴシックが選択されている場合に、同じ公式TTFのパスをOptions.vector(dpi, fontFiles)へ明示すると、条件を満たす標準・太字を埋め込めます。合成斜体などは輪郭での出力になります。BIZのTTFを渡すだけで、使用中のMS ゴシックがBIZに切り替わることはありません。

同梱の公式BIZ UDゴシックはSIL Open Font License 1.1による配布です。ライセンス全文と取得元はengine JAR内のcom/pao/reports/engine/fonts/biz-ud-gothic/OFL.txtとprovenance.jsonに収録しています。

ベクターPDFへフォントを埋め込む場合は、フォントのライセンスと再配布条件も確認してください。エンジンがインターネットからフォントを取得することはありません。

性能RM053

安全性RM054

13. エラー処理の基本RM055

try {
    ReportDocument definition =
            new ReportDefinitionIO().read(definitionPath);
    new PdfExporter().export(definition, data, outputPath);
} catch (NoSuchFileException ex) {
    // 帳票定義が見つからない
} catch (CancellationException ex) {
    // 利用者またはタイムアウトにより中止された
} catch (IOException ex) {
    // PREPDJの解析、画像読込、PDF保存などに失敗した
} catch (IllegalArgumentException ex) {
    // ページ番号、DPI、帳票モデルなどの指定が不正
}

利用者向けのエラーメッセージと、調査用の例外・ログは分けてください。Web APIでは内部例外をそのままレスポンスへ返さず、要求IDとともにサーバーログへ記録します。

14. 目的別の早見表RM056

やりたいこと 最初に見る箇所 主なAPI
PDFを作る 3、5.1 ReportDefinitionIO、ReportData、PdfExporter
明細帳票を作る 4.2 ReportData.rows
画像プレビューを作る 5.3、5.5 ReportRenderer
プリンターへ出力する 5.4 PrinterOutput
完成帳票を保存・再印刷する 6 PreviewJob、PreviewJobIO
Web APIからPDFを返す 7.1 PdfExporter
Web画面にSVGを表示する 7.2 SvgExporter
PREPEJをRESTで受け取る 7.3 PreviewJobIO
従来帳票を移行する 9.2 readWithDiagnostics(...)
メソッドを調べる 10 APIリファレンス
帳票プロパティを調べる 11 モデルプロパティリファレンス

15. 付属サンプルを実行するRM057

ZIPを全体ごと展開し、Native/Pure-Java/samples/README.html を開いてください。開発者の作業フォルダーや、本製品全体のソースビルド環境は不要です。

番号フォルダー 学ぶこと
01.あっという間に帳票出力 短いコードで定義読込・値設定・帳票出力を試す
02.全帳票をパソコンでプレビュー 同じサンプルデータをSQLiteから読み、PC上でプレビュー・PDF・印刷する
03.全帳票をWebでプレビュー Javaエンジンを使うWebアプリで帳票を表示する
04.Web API・デスクトップ連携 サーバーで作った印刷データをHTTPで受け取り、PCで表示する

使いたい番号フォルダーをエディターやIDEで開き、その中のREADMEの手順で起動します。READMEには、必要なJava環境、実行コマンド、読むソース、変更する箇所、停止方法をまとめています。Java 21を基準に、同梱SDKと同じ版のサンプルを使ってください。

03のWebアプリと04のRESTサーバーは、直接起動する方法に加えてDockerからの起動も選べます。04のデスクトップ画面はDockerに入れず、PC側で直接起動します。画面のURLとAPIのパスは、各サンプルのREADMEにあるものを使ってください。

最初は01のタイトルや会社名を書き換えて、帳票へ反映されることを確認してください。次に02以降へ進むと、同じ基本を明細帳票やWeb連携へ広げられます。

16. Reports.NET互換セッションAPIRM058

com.pao.reports.engine.ReportSession は、定義体を順に読み込み、ページを確定し、旧 Reports.net と交換可能な印刷データを保存する公開 API です。

SaveXPS は Pure Java API の対象外です。ブラウザー版の CutByPage / SwapPdfImage と、サーバー版の画像スワップ指定は別の実行能力であり、言語別 PREPEJ builder の能力ではありません。

ページ単位の印刷:CutByPageRM059

レシート・ラベルプリンターで、ジョブ終了時のカットをページごとに行いたい場合に使います。Javaでは session.setCutByPage(true) で設定し、session.isCutByPage() で取得します。ReportSession.submitPrint(...) による印刷ジョブ作成に適用され、PDFの改ページや帳票寸法は変更しません。

false は選択したページをまとめて1ジョブ、true はページごとに別ジョブにします。実際に用紙をカットするには、プリンターとドライバー側のジョブ終端カット設定が必要です。カッターを持たないプリンターにカット機能を追加するものではありません。

画像の多いPDF:SwapPdfImageRM060

大きな画像を多数のページに配置する場合、PDF内部で保持する画像データが増えます。session.setSwapPdfImage(true) をPDF出力前に指定すると、一時ディスクを使って保持メモリーを抑えます。取得は session.isSwapPdfImage()、出力は session.savePdf(path, control) です。このセッションの出力は画像PDFです。

直接 PdfExporter を使う場合は、画像PDFに PdfExporter.Options.imageWithDiskSpill(dpi)、ベクターPDFに PdfExporter.Options.vectorWithDiskSpill(dpi, fontFiles) を指定します。退避の有無だけを比較する場合は、出力方式・DPI・フォントを同じにしてください。

一時領域への書込み権限と空き容量が必要です。入力画像や現在処理中の画像のメモリーまで不要になるわけではなく、必ず一定量に収まる保証はありません。一時データは通常終了・例外・取消時に閉じて削除しますが、プロセスの強制終了や電源断はこの後処理の保証外です。退避によってディスクI/Oが増えるため、通常の小さな帳票では既定の false を使用できます。

17. ライセンスRM061

本製品は商用ライセンスです。評価、開発環境、サーバー配置、再配布、組み込み利用の条件は、製品に付属するライセンス文書を確認してください。