マニュアル一覧PDFで読む

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

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

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

Reports.web Pure Javaの全体構成

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

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

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

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

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

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

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

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

2. 開発を始めるRM002

2.1 動作環境RM003

製品に含まれるエンジンJARと、その依存ライブラリをアプリケーションのクラスパスへ追加してください。製品ソースをGradleのマルチプロジェクトとして利用する場合は、アプリケーション側から engine プロジェクトを参照します。

dependencies {
    implementation(project(":engine"))
}

エンジンはPDF出力とJSON/XML処理のため、PDFBoxおよびJacksonを使用します。配布物をJAR単位で組み込む場合は、製品に同梱された依存JARも一緒に配置してください。

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

次のプログラムは、invoice.prepdj を読み、3つの値を設定して invoice.pdf を作ります。

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 CreateInvoicePdf {
    public static void main(String[] args) throws Exception {
        Path definitionFile = Path.of("reports", "invoice.prepdj");
        Path outputFile = Path.of("output", "invoice.pdf");
        Files.createDirectories(outputFile.toAbsolutePath().getParent());

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

        // 帳票へ差し込む値を設定する
        ReportData data = new ReportData();
        data.values.put("顧客名", "株式会社サンプル");
        data.values.put("請求日", "2026年9月14日");
        data.values.put("合計金額", 120000);

        // PDFを作る
        new PdfExporter().export(definition, data, outputFile);
    }
}

data.values のキーには、デザイナーで文字オブジェクトの「連結する項目」に設定した名前を指定します。名前が一致したオブジェクトへ値が表示されます。

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);

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

分類 プロパティ名
位置・大きさ XYWidthHeightAngleRotation
表示・値 VisibleTextValue
文字 FontFamilyFontNameFontSizeBoldHorizontalAlignmentVerticalAlignment
塗り FillColorFillEnabledFillStyleHatchDensity
線・枠 StrokeColorStrokeWidthStrokeStyleDashPatternLineTypeTextBorderEnabled

動的プロパティは一時的な出力変更です。元の 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

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

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.jsnative-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サンプルでは、プレビュアーを初期化する前の ReportsNativeConfigexternalChromeControl: 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.valuesReportData.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 拡張子に応じて帳票定義を保存する
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を読み込む
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 A4などの用紙名
widthMm, heightMm double 用紙の幅と高さ。単位はmm
gridMm double デザイナーのグリッド間隔。単位はmm
designScalePercent double デザイナーの表示倍率
showGrid boolean グリッドを表示するか
snapToGrid boolean オブジェクトをグリッドへ合わせるか
objectsLocked boolean 帳票全体のオブジェクトをロックするか
defaultFontFamily String 新規文字オブジェクトの既定フォント
defaultFontSizePt double 新規文字オブジェクトの既定サイズ
objects List<ReportObject> 帳票に配置されたオブジェクト
extensions Map<String, Object> 互換性維持用の拡張情報。通常は変更しない
copy() ReportDocument 帳票定義の複製を作る

11.2 ReportObject 共通プロパティRM045

プロパティ 説明
id オブジェクトを識別するID
name デザイナー上の項目名
type TEXTIMAGEBARCODELINERECTANGLEELLIPSE
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 などの文字サイズ単位
bold, italic, underline, strikeout 太字、斜体、下線、取消線
horizontalAlignment LEFTCENTERRIGHT
verticalAlignment TOPMIDDLECENTERBOTTOM
textVertical 縦書き
textElastic 文字を枠へ合わせる
fixingFontHeight フォント高さを固定する
textColor #RRGGBB 形式の文字色
textBorderEnabled 文字枠を表示するか
textOutlineWidth, textOutlineColor 文字の輪郭幅と色

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

プロパティ 説明
strokeColor 線色
strokeWidth 線幅
strokeStyle 線種
dashPattern 独自の破線パターン
lineThickness 円弧などの形状を決める線パラメーター
lineType 単線・二重線などの線種情報
fillEnabled 塗りを有効にするか
fillStyle NoneSolidHatch
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 黒バー幅のドット補正
barcodeImageMargin 画像余白
barcodeStartStop スタート/ストップ文字を表示するか
barcodeCodeSet CODE128などのコードセット
qrErrorCorrection QRコードの誤り訂正レベル
qrVersion QRコードの型番
stringEncoding 文字エンコーディング
pdf417Rows, pdf417Columns PDF417の行数と列数

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

フォントRM051

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

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

性能RM052

安全性RM053

13. エラー処理の基本RM054

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. 目的別の早見表RM055

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

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

製品ソースに含まれるサンプルでは、ローカルプレビューとWeb/RESTの両方を確認できます。

cd C:\Pao\Pao.Reports.Java
$env:JAVA_HOME='C:\Program Files\Android\openjdk\jdk-21.0.8'
.\gradlew.bat :samples:clean :samples:test :samples:installDist --no-daemon
.\samples\build\install\samples\bin\samples.bat

Spring BootのWebサンプル:

.\gradlew.bat :samples:bootRun --no-daemon

起動後、ブラウザーで http://localhost:8080/ を開きます。

主な参照用API:

API 内容
GET /api/samples サンプル帳票一覧
GET /api/reports/{id}/pdf サンプルPDF
POST /api/reports/{id}/pdf values を受け取りPDFを生成
GET /api/reports/{id}/svg?page=0 指定ページのSVG
GET /api/reports/{id}/data 自己完結PREPEJ
POST /api/print-data/pdf 自己完結PREPEJからPDFを生成
POST /api/print-data/svg?page=0 自己完結PREPEJからSVGを生成

最初は第3章のPDF作成を動かし、次に自分のPREPDJと項目名へ置き換えてください。そのプログラムを基に、必要な出力形式やWeb APIを追加していくのが最短です。

16. ライセンスRM057

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