はじめに
JavaとPythonを連携させて、画像やデータをもとにPDFを自動生成する業務システムの構築は、帳票出力やレポート生成に便利です。
この記事では、以下の構成で PDF出力REST API を構築します。
- Java(Spring Boot)からHTTP経由でPythonへリクエスト
- Python(Flask)側でPDFを生成(
reportlab
使用) - Java側でPDFを受け取りファイル保存
1. Python側:PDF生成API(Flask+reportlab)
まずはPythonで簡単なPDFを作成して返すAPIを構築します。
必要ライブラリのインストール
pip install flask reportlab
app.py
from flask import Flask, send_file
from reportlab.pdfgen import canvas
import io
app = Flask(__name__)
@app.route("/generate-pdf")
def generate_pdf():
buffer = io.BytesIO()
c = canvas.Canvas(buffer)
c.drawString(100, 750, "Hello from Python PDF!")
c.save()
buffer.seek(0)
return send_file(buffer, as_attachment=True, download_name="sample.pdf", mimetype="application/pdf")
if __name__ == "__main__":
app.run(port=5000)
このFlaskサーバーを起動しておきます:
python app.py
2. Java側:Python APIを呼び出してPDFを保存
必要な依存(Spring Boot)
pom.xml
に以下を追加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
コントローラー例(PdfController.java)
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.*;
import java.net.URI;
import java.net.http.*;
@RestController
public class PdfController {
@GetMapping("/download-pdf")
public String downloadPdf() throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("http://localhost:5000/generate-pdf"))
.build();
HttpResponse<InputStream> response = client.send(request, HttpResponse.BodyHandlers.ofInputStream());
File targetFile = new File("received.pdf");
try (OutputStream out = new FileOutputStream(targetFile)) {
response.body().transferTo(out);
}
return "PDF保存完了: " + targetFile.getAbsolutePath();
}
}
ブラウザで http://localhost:8080/download-pdf
にアクセスすると、Pythonで生成されたPDFがダウンロードされます。
まとめ
- JavaからPythonの処理をREST経由で呼び出すことで、柔軟なタスク分担が可能になります。
- PDF帳票の生成をPythonに任せることで、Java側の実装がシンプルになります。
- 業務システムやレポート自動化に応用できます。