アイキャッチ

実装・エラー解決

HTTPレスポンスでPDFをプレビューする

Javaで生成したPDFをブラウザへ返したところ、表示する前にダウンロードが始まりました。レスポンスの種類と、表示方法を指定するヘッダーを確認します。

  • 発生した問題
  • 解決方法

背景。JasperReportsで生成したPDFをレスポンスへ書き出し、Edgeで開きました。プレビューしたいURLで、汎用のファイル形式と保存を促す指定を返していました。

修正前

response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=\"sample.pdf\"");

application/octet-stream は汎用のバイナリです。attachment はファイルとして扱うようブラウザに伝え、filename は保存時のファイル名の候補になります。

プレビュー用のレスポンスではPDFとして application/pdf を返し、inline を指定します。次の例では、保存用のURLにも同じPDFのバイト列を渡せます。

import java.io.IOException;
import jakarta.servlet.http.HttpServletResponse;

public final class PdfResponse {
    private PdfResponse() {}

    public static void send(HttpServletResponse response, byte[] pdf, boolean preview)
            throws IOException {
        String disposition = preview ? "inline" : "attachment";
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", disposition + "; filename=\"sample.pdf\"");
        response.getOutputStream().write(pdf);
    }
}

ブラウザ側のPDF表示設定によっては、inline を指定してもダウンロードされます。開発者ツールでContent-TypeとContent-Dispositionを確認すると、サーバーが返した指定を切り分けられます。

出典 MDNのContent-Disposition解説

-実装・エラー解決
-