Spring - 在浏览器中显示 PDF 文件而不是下载

作者:编程家 分类: spring 时间:2025-05-30

如何在浏览器中显示PDF文件而不是下载

在开发Web应用程序时,有时我们希望在浏览器中直接显示PDF文件,而不是将其下载到用户的计算机。这可以为用户提供更方便的浏览体验,特别是当我们需要展示大量的PDF文件时。本文将介绍如何使用Spring框架来实现在浏览器中显示PDF文件的功能,并提供一个案例代码。

1. 添加依赖

首先,我们需要在项目的构建文件中添加相关的依赖项。在Spring Boot项目中,我们可以在pom.xml文件中添加以下依赖:

xml

org.springframework.boot

spring-boot-starter-thymeleaf

org.apache.pdfbox

pdfbox

2.0.26

这里我们使用了Thymeleaf作为模板引擎,并添加了PDFBox库用于处理PDF文件。

2. 创建Controller

接下来,我们需要创建一个Controller来处理PDF文件的请求和响应。在Controller中,我们可以使用Spring的`ResponseEntity`类来返回PDF文件的内容。

java

import org.apache.pdfbox.pdmodel.PDDocument;

import org.springframework.core.io.ByteArrayResource;

import org.springframework.core.io.InputStreamResource;

import org.springframework.http.HttpHeaders;

import org.springframework.http.MediaType;

import org.springframework.http.ResponseEntity;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

@Controller

@RequestMapping("/pdf")

public class PdfController {

@GetMapping("/view")

public ResponseEntity viewPdf() throws IOException {

// 从文件或其他来源加载PDF内容

PDDocument document = PDDocument.load(getClass().getResourceAsStream("/path/to/pdf/file.pdf"));

ByteArrayOutputStream baos = new ByteArrayOutputStream();

document.save(baos);

document.close();

// 设置HTTP响应头

HttpHeaders headers = new HttpHeaders();

headers.setContentType(MediaType.APPLICATION_PDF);

headers.setContentDispositionFormData("inline", "file.pdf");

// 返回PDF内容

return ResponseEntity

.ok()

.headers(headers)

.body(new InputStreamResource(new ByteArrayResource(baos.toByteArray())));

}

}

在上面的代码中,我们创建了一个`viewPdf`方法来处理浏览器中PDF文件的请求。首先,我们使用PDFBox库加载PDF文件的内容,并将其保存到一个`ByteArrayOutputStream`中。然后,我们设置HTTP响应头,将其内容类型设为`application/pdf`,并指定`Content-Disposition`为`inline`,这样浏览器将直接显示PDF文件。最后,我们使用`ResponseEntity`类将PDF内容作为流返回给浏览器。

3. 创建HTML页面

为了测试我们的功能,我们需要创建一个HTML页面来发起浏览器中PDF文件的请求。在Thymeleaf模板中,我们可以使用如下代码来实现:

html

View PDF

在浏览器中显示PDF文件

点击这里查看PDF文件

在上述代码中,我们创建了一个包含一个链接的HTML页面。当用户点击链接时,将会向`/pdf/view`发送请求来查看PDF文件。

案例代码

java

import org.apache.pdfbox.pdmodel.PDDocument;

import org.springframework.core.io.ByteArrayResource;

import org.springframework.core.io.InputStreamResource;

import org.springframework.http.HttpHeaders;

import org.springframework.http.MediaType;

import org.springframework.http.ResponseEntity;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

@Controller

@RequestMapping("/pdf")

public class PdfController {

@GetMapping("/view")

public ResponseEntity viewPdf() throws IOException {

// 从文件或其他来源加载PDF内容

PDDocument document = PDDocument.load(getClass().getResourceAsStream("/path/to/pdf/file.pdf"));

ByteArrayOutputStream baos = new ByteArrayOutputStream();

document.save(baos);

document.close();

// 设置HTTP响应头

HttpHeaders headers = new HttpHeaders();

headers.setContentType(MediaType.APPLICATION_PDF);

headers.setContentDispositionFormData("inline", "file.pdf");

// 返回PDF内容

return ResponseEntity

.ok()

.headers(headers)

.body(new InputStreamResource(new ByteArrayResource(baos.toByteArray())));

}

}

在上面的代码中,我们创建了一个`PdfController`类,其中包含了一个处理浏览器中PDF文件请求的`viewPdf`方法。方法中使用PDFBox库加载PDF文件,并将其转换为字节数组。然后,我们设置HTTP响应头,并返回PDF内容给浏览器。

以上就是如何使用Spring框架在浏览器中显示PDF文件而不是下载的方法。通过添加相应的依赖、创建Controller和HTML页面,我们可以实现在浏览器中直接显示PDF文件的功能。这对于需要展示大量PDF文件的Web应用程序来说是非常方便和实用的。