Thymeleaf (Java)
Java のテンプレートエンジン Thymeleaf を使用して HTML 文字列を生成し、それを pdfg の API に送信して PDF に変換する方法を説明します。
技術的な概要
- Thymeleaf テンプレートを作成
- テンプレートにデータを渡して HTML 文 字列を生成
- 生成された 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());
}
}
}