当前位置: 首页 > 知识库问答 >
问题:

如何在响应时发送PDF文件

越英韶
2023-03-14

我正在尝试编写一个将图像转换为PDF文件的web应用程序。用户发送两幅图像(JPEG、PNG),并应接收和下载PDF文件。

目前的主要问题是我不知道如何将PDF文件返回给客户端。

这是我的控制器:

    @PostMapping(path = "/upload",
            consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public void uploadFiles(@RequestParam("files") MultipartFile[] files) throws IOException {
        imageToPdfConversionService.convert(files);
    } 

这是将图像转换为PDF文件的服务(这里我使用itextpdf库):

public void convert(MultipartFile[] files) throws IOException {

        List<ImageData> imagesData = Arrays.stream(files)
                .map(file -> {
                    try {
                        return ImageDataFactory.create(file.getBytes());
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                })
                .collect(Collectors.toList());

//        PdfDocument pdfDocument = new PdfDocument(new PdfWriter("ImageToPdf.pdf"));
        FileOutputStream fileOutputStream = new FileOutputStream("letspdf-server/src/main/resources/documents/file.pdf");
        PdfDocument pdfDocument = new PdfDocument(new PdfWriter(fileOutputStream));

        Document document = new Document(pdfDocument);

        for (ImageData image : imagesData) {
            Image img = new Image(image);
            img.setWidth(pdfDocument.getDefaultPageSize().getWidth() - 50);
            img.setAutoScaleHeight(true);
            document.add(img);
            pdfDocument.addNewPage();
        }
        pdfDocument.close();
    }

另外,当生成文件以从存储中下载文件时,可以将PDF文件存储在某个位置,并在客户端创建“下载”按钮?

共有1个答案

西门骁
2023-03-14

因此,首先您需要更改api以返回响应实体并将生成的pdf转换为字节数组。我将附上一个代码片段作为示例

public static ResponseEntity<Resource> makeResponse(byte[] file, String filename, MultiValueMap<String, String> customHeaders) {
    MediaType mediaType = MediaType.APPLICATION_OCTET_STREAM;
    HttpHeaders headers = new HttpHeaders();
    if (StringUtils.isNotEmpty(filename)) {
        try {
            mediaType = MediaType.valueOf(MIME_TYPES.detect(filename));
        } catch (Exception var6) {
        }

        ContentDisposition contentDisposition = ContentDisposition.builder("attachment").filename(filename, StandardCharsets.UTF_8).build();
        headers.setAccessControlExposeHeaders(ACCESS_CONTROL_EXPOSE_HEADERS);
        headers.setContentDisposition(contentDisposition);
    }

    if (customHeaders != null && !customHeaders.isEmpty()) {
        headers.addAll(customHeaders);
    }

    ByteArrayResource body = null;
    if (file != null) {
        body = new ByteArrayResource(file);
    }

    return ((BodyBuilder)ResponseEntity.ok().headers(headers)).contentType(mediaType).body(body);
}
 类似资料:
  • 问题内容: 我的要求是使用HTTP Servlet将PDF数据响应到移动客户端(iPhone)。 我是按照以下方式完成的,但是我没有在客户端获得预期的输出。 我遵循的方法正确吗?请指教。 谢谢。 问题答案: 您必须使用ServletOutputStream及其write()方法将字节写入response。

  • 有人能告诉我如何从Java中的HTTP触发器Azure函数发送pdf响应吗。 一旦该功能被触发,我需要从Azure存储中读取pdf,并将pdf作为响应返回到浏览器。

  • 问题内容: Expressjs框架具有sendfile()方法。我如何在不使用整个框架的情况下做到这一点。我正在使用node-native- zip创建档案,并将其发送给用户。 问题答案: 这是一个示例程序,它将通过从磁盘流式传输myfile.mp3来发送myfile.mp3(也就是说,在发送文件之前,它不会将整个文件读入内存)。服务器在端口2000上侦听。 [更新] 正如@Aftershock在

  • 问题内容: 我有一个PHP脚本,需要使用HTTP响应代码(状态代码)进行响应,例如HTTP 200 OK,或一些4XX或5XX代码。 如何在PHP中做到这一点? 问题答案: 我刚刚发现了这个问题,并认为它需要一个更全面的答案: 从 PHP 5.4开始 ,有三种方法可以实现此目的: 自行组装响应代码(PHP> = 4.0) 该函数有一个特殊的用例,可以检测HTTP响应行,并让您用自定义行替换它 但是

  • 我有问题让我的Angular2客户端与我的Spring服务器通信,因为我添加了Spring Security性,即当我尝试向服务器登录url发送包含鉴别信息的JSON时,我得到一个403“无效的CSRF令牌'null'是在请求参数'_csrf'或标头'X-CSRF-TOKEN'上找到的。” 我知道我应该在我的响应头上传递一个令牌,供客户端使用,但没有传递这个令牌。我尝试了这个答案,但令牌仍然没有被

  • 问题内容: 我正在编辑内置的表单。 我在对话框中显示该表单,然后提交。 数据已正确输入数据库。 但是我不知道是否需要将一些寄回。其实我对事情有点困惑。 假设我在表中使用``jQuery添加了一行,当我提交表单时,然后在提交数据之后,我想发回那些行数据,以便我可以动态添加表行以显示添加的数据。 我很困惑如何获取这些数据。 这是我当前的代码: 这只是带有成功消息的模板。 问题答案: Symfony 2