JavaとPythonでPDFを自動生成するREST APIの作り方【Spring Boot+Flask連携】

はじめに

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側の実装がシンプルになります。
  • 業務システムやレポート自動化に応用できます。
タイトルとURLをコピーしました