Java 基础教程

Java 面向对象

Java 高级教程

Java 笔记

Java FAQ

Java controller 返回多个pdf文件


在 Java 的 Spring 框架中,如果你需要从控制器(Controller)返回多个 PDF 文件,你可以通过以下几种方式实现。下面我将为你详细介绍每种方式的步骤流程,并提供相应的示例代码和 Maven/Gradle 依赖坐标。

假设你已经有一个 Spring Boot 项目,并且已经配置好了 Controller 和需要返回的 PDF 文件。

打包为一个 ZIP 文件

这种方式是将多个 PDF 文件打包成一个 ZIP 文件,然后将 ZIP 文件返回给客户端。

步骤流程:

  1. 创建一个临时目录,用于存放所有要打包的 PDF 文件。
  2. 将所有的 PDF 文件复制到临时目录。
  3. 使用 Java 的 ZipOutputStream 来创建一个 ZIP 文件并将所有 PDF 文件添加到 ZIP 中。
  4. 将生成的 ZIP 文件作为响应返回给客户端。

示例代码:

@RestController
public class PdfController {

    @GetMapping("/multiple-pdfs")
    public ResponseEntity<Resource> getMultiplePDFs() throws IOException {
        // Create a temporary directory
        Path tempDirectory = Files.createTempDirectory("pdfs");

        // Copy PDF files to the temporary directory
        // Assuming you have pdf1.pdf and pdf2.pdf in resources folder
        ClassPathResource pdf1 = new ClassPathResource("pdf1.pdf");
        ClassPathResource pdf2 = new ClassPathResource("pdf2.pdf");
        Files.copy(pdf1.getInputStream(), tempDirectory.resolve("pdf1.pdf"));
        Files.copy(pdf2.getInputStream(), tempDirectory.resolve("pdf2.pdf"));

        // Create a ZIP file
        Path zipFile = Files.createTempFile("pdfs", ".zip");
        try (FileOutputStream fos = new FileOutputStream(zipFile.toFile());
             ZipOutputStream zipOut = new ZipOutputStream(fos)) {

            Files.walk(tempDirectory)
                 .filter(path -> !Files.isDirectory(path))
                 .forEach(path -> {
                     try (FileInputStream fis = new FileInputStream(path.toFile())) {
                         ZipEntry zipEntry = new ZipEntry(tempDirectory.relativize(path).toString());
                         zipOut.putNextEntry(zipEntry);
                         byte[] bytes = new byte[1024];
                         int length;
                         while ((length = fis.read(bytes)) >= 0) {
                             zipOut.write(bytes, 0, length);
                         }
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                 });
        }

        // Return the ZIP file as ResponseEntity
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDisposition(ContentDisposition.attachment().filename("pdfs.zip").build());

        return new ResponseEntity<>(new FileSystemResource(zipFile.toFile()), headers, HttpStatus.OK);
    }
}

Maven 依赖:

<!-- Add Spring Web dependency -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

使用 Multipart 响应

这种方式是将多个 PDF 文件分别作为多个部分添加到响应中,以 multipart 形式返回给客户端。

步骤流程:

  1. 创建一个 Multipart 相关的对象,如 org.springframework.http.ResponseEntityorg.springframework.http.HttpHeaders
  2. 将每个 PDF 文件转换为 org.springframework.core.io.Resource
  3. 将每个 PDF 文件和相关的 Headers 添加到 Multipart 响应中。

示例代码:

@RestController
public class PdfController {

    @GetMapping("/multiple-pdfs")
    public ResponseEntity<MultipartBody> getMultiplePDFs() throws IOException {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_MIXED);

        // Create a MultipartBody and add PDFs to it
        MultipartBody multipartBody = new MultipartBody();

        // Assuming you have pdf1.pdf and pdf2.pdf in resources folder
        ClassPathResource pdf1 = new ClassPathResource("pdf1.pdf");
        ClassPathResource pdf2 = new ClassPathResource("pdf2.pdf");

        multipartBody.addPart(new InputStreamResource(pdf1.getInputStream()), "application/pdf", "pdf1.pdf");
        multipartBody.addPart(new InputStreamResource(pdf2.getInputStream()), "application/pdf", "pdf2.pdf");

        return new ResponseEntity<>(multipartBody, headers, HttpStatus.OK);
    }
}

Maven 依赖:

<!-- Add Spring Web dependency -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Add Spring HATEOAS for MultipartBody -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>

这两种方式都可以实现在 Java 控制器中返回多个 PDF 文件。你可以根据你的具体需求和项目结构选择其中一种方式进行实现。记得根据项目需要适当调整代码和错误处理。

手动合并:也可以手动编写Java代码来解析PDF文件格式,然后将多个PDF文件的内容合并到一个新的PDF文件中。以下是使用PDFBox来合并 ...
在Java中,你可以使用不同的方式来接收一个List参数,例如在一个Controller中接收HTTP请求的List参数。添加SpringW ...
在Java中生成PDF文件的过程通常涉及到使用PDF模板,然后填充数据到模板中,最终生成完整的PDF文件。Maven依赖:Gradle依赖: ...
关闭`ZipOutputStream`和所有的`FileInputStream`对象。示例代码:###使用ApacheCommonsComp ...
在Java中生成PDF有多种方式,其中一些常见的方法包括使用第三方库、使用Java自带的库、以及使用HTML/CSS转换工具。###步骤流程 ...