logo

Thymeleaf (Java)

Java のテンプレートエンジン Thymeleaf を使用して HTML 文字列を生成し、それを pdfg の API に送信して PDF に変換する方法を説明します。

技術的な概要

  1. Thymeleaf テンプレートを作成
  2. テンプレートにデータを渡して HTML 文字列を生成
  3. 生成された HTML 文字列を pdfg の API に送信して PDF 化

サンプル

テンプレートの定義

<!-- templates/invoice.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head></head>
  <body>
    <div class="invoice">
      <h1>請求書</h1>
      <table>
        <thead>
          <tr>
            <th>品目</th>
            <th>金額</th>
          </tr>
        </thead>
        <tbody>
          <tr th:each="item : ${items}">
            <td th:text="${item.name}"></td>
            <td th:text="${item.price} + '円'"></td>
          </tr>
        </tbody>
      </table>
      <p class="total" th:text="'合計: ' + ${total} + '円'"></p>
    </div>
  </body>
</html>

テンプレートの使用と PDF 生成

// GeneratePdf.java
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;

public class GeneratePdf {
    public static void main(String[] args) throws Exception {
        // Thymeleafの設定
        TemplateEngine templateEngine = new TemplateEngine();
        ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
        resolver.setPrefix("/templates/");
        resolver.setSuffix(".html");
        templateEngine.setTemplateResolver(resolver);

        // データの準備
        List<Map<String, Object>> items = List.of(
            Map.of("name", "商品A", "price", 1000),
            Map.of("name", "商品B", "price", 2000)
        );
        int total = 3000;

        // コンテキストの設定
        Context context = new Context();
        context.setVariable("items", items);
        context.setVariable("total", total);

        // HTML文字列の生成
        String html = templateEngine.process("invoice", context);

        // リクエストボディの作成
        String requestBody = String.format("""
            {
                "html": %s,
                "pdfOptions": {
                    "format": "A4"
                }
            }
            """, html);

        // pdfgのAPIにリクエスト
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.pdfg.net/v1"))
            .header("Content-Type", "application/json")
            .header("Authorization", "Bearer YOUR_API_KEY")
            .POST(HttpRequest.BodyPublishers.ofString(requestBody))
            .build();

        HttpResponse<byte[]> response = client.send(request,
            HttpResponse.BodyHandlers.ofByteArray());

        // PDFの保存
        if (response.statusCode() == 200) {
            Files.write(Path.of("invoice.pdf"), response.body());
        }
    }
}