java实现图片转pdf,并通过流的方式进行下载(前后端分离)

首先需要导入相关依赖,由于具体依赖本人也不是记得很清楚了,所以简短的说一下。

  1. iText:PDF 操作库,用于创建和操作 PDF 文件。可通过 Maven 或 Gradle 引入 iText 依赖。

  2. MultipartFile:Spring 框架中处理文件上传的类。通常用于接收前端上传的文件数据。

  3. HttpServletRequest:Java Servlet API 中的类,用于获取 HTTP 请求的相关信息,如请求方式、参数等。

  4. BufferedImage:Java 中用于表示图像的类,通常与 ImageIO 结合使用来读取图片文件。

  5. ByteArrayOutputStream:Java 中的字节数组输出流,用于将数据写入到字节数组中。

  6. DocumentPdfWriter:iText 库中的类,分别用于创建 PDF 文档和写入 PDF 文件。

  7. Image:iText 库中的类,用于处理图像,并将图像添加到 PDF 文档中。

  8. Rectangle:iText 库中的类,用于表示 PDF 页面的大小。

XML 复制代码
 <!--ITextPdf,操作PDF文件的工具类-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.4.2</version>
        </dependency>
        <dependency>
            <groupId>com.documents4j</groupId>
            <artifactId>documents4j-local</artifactId>
            <version>1.0.3</version>
        </dependency>
        <dependency>
            <groupId>com.documents4j</groupId>
            <artifactId>documents4j-transformer-msoffice-word</artifactId>
            <version>1.0.3</version>
        </dependency>

以上提供一些依赖,是需要用到的,然后在application.yml中添加以下配置:

java 复制代码
web:
  upload-path: E:/PictureTool/
  resources:
   static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}
  • 配置web.upload-path为与项目代码分离的静态资源路径,即:文件上传保存根路径
  • 配置spring.resources.static-locations,除了带上Spring Boot默认的静态资源路径之外,加上file:${web.upload-path}指向外部的文件资源上传路径。该路径下的静态资源可以直接对外提供HTTP访问服务。

然后就需要写具体的实现逻辑了:

java 复制代码
 public R imgToPdf(MultipartFile file, HttpServletRequest request) {
        // 获取文件在服务器上的存储路径
        String imagePath = getFilePath(file);
        // 获取文件名,去掉文件扩展名
        String filename = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
        // 将文件名赋值给成员变量FileName
        FileName = filename;
        try {
            // 使用ImageIO读取文件内容,转换为BufferedImage对象
            BufferedImage img = ImageIO.read(new File(imagePath));
            // 创建一个ByteArrayOutputStream对象,用于存储转换后的PDF文件
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            // 创建一个Document对象,用于存储PDF文档
            Document doc = new Document();
            // 创建一个PdfWriter对象,用于将BufferedImage对象转换为PDF文件
            PdfWriter.getInstance(doc, new FileOutputStream(uploadPath + filename + ".pdf"));
            // 存储PDF文件的路径
            FilePath = uploadPath + filename + ".pdf";
            System.out.println(uploadPath + filename + ".pdf");
            // 打开文档
            doc.open();
            // 将BufferedImage对象添加到PDF文档中
            Image image = Image.getInstance(imagePath);
            // 设置文档的页面大小为BufferedImage的大小
            doc.setPageSize(new Rectangle(img.getWidth(), img.getHeight()));
            // 将BufferedImage对象添加到PDF文档的第一个页面
            doc.add(image);
            // 关闭文档
            doc.close();

            // 调用addUserOperation方法,记录用户操作
            boolean re = addUserOperation(file, "pdf", 1, request);
            System.out.println("转换成功,re为" + re);

            // 获取PDF文件的下载链接
            String downloadLink = request.getScheme() + "://" + request.getServerName() + ":" +
                    request.getServerPort() + request.getContextPath() + "/pictureTool/" + filename + ".pdf";

            // 返回PDF文件的下载链接
            return R.Success("图片转pdf转换成功", downloadLink);
        } catch (Exception e) {
            // 如果转换失败,记录用户操作
            e.printStackTrace();
            boolean re = addUserOperation(file, "pdf", 0, request);
            System.out.println("转换失败,re为" + re);
            // 返回错误信息
            return R.Failed(500, "图片转换失败");
        }
    }

以上代码接受一个文件,然后进行转换为pdf并保存在本地指定的文件夹中,接下来使用输出流的方式进行文件下载。

java 复制代码
 public R downloadFile(HttpServletRequest request, HttpServletResponse response)
            throws IOException {

        // 获取文件路径和文件名
        String filePath = FilePath;
        String fileName = FileName;

        // 设置响应头,指定下载文件的名称
        response.setHeader("Content-Disposition",
                "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));

        try {
            // 打开文件
            File file = new File(filePath);
            FileInputStream fileInputStream = new FileInputStream(file);

            // 读取文件内容到字节数组
            byte[] fileByte = new byte[(int) file.length()];
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] bytes = new byte[1024];
            int len;
            while ((len = fileInputStream.read(bytes, 0, bytes.length)) != -1) {
                byteArrayOutputStream.write(bytes, 0, len);
            }
            byteArrayOutputStream.close();
            fileByte = byteArrayOutputStream.toByteArray();

            // 将文件内容写入响应对象
            OutputStream outputStream = response.getOutputStream();
            outputStream.write(fileByte);
            outputStream.flush();
            outputStream.close();

            // 返回成功信息
            return R.Success("文件下载成功");
        } catch (Exception e) {
            // 如果下载失败,返回失败信息
            e.printStackTrace();
            return R.Failed("文件下载失败");
        }
    }

其中R是我自定义的一个响应类,改成你自己的就可以了~

最后,记得放行你存放文件的盘符:

相关推荐
JosieBook5 分钟前
【SpringBoot】37 核心功能 - 高级特性- Spring Boot 中的 自定义 Starter 完整教程
java·spring boot·后端
guygg8812 分钟前
Alpha稳定分布概率密度函数的MATLAB实现
开发语言·matlab
百***069422 分钟前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
小二·25 分钟前
Elasticsearch 面试题精编(26题|含答案|分类整理)
java·大数据·elasticsearch
BD_Marathon33 分钟前
在 Linux 环境中配置 Eclipse 以开发 Hadoop 应用
java·hadoop·eclipse
百***374833 分钟前
Spring Boot 中 RabbitMQ 的使用
spring boot·rabbitmq·java-rabbitmq
草莓熊Lotso1 小时前
C++ 二叉搜索树(BST)完全指南:从概念原理、核心操作到底层实现
java·运维·开发语言·c++·人工智能·经验分享·c++进阶
oliveira-time1 小时前
单例模式中的饿汉式
java·开发语言
凌波粒1 小时前
SpringMVC基础教程(1)--MVC/DispathcerServlet
java·spring·mvc
武子康1 小时前
Java-173 Neo4j + Spring Boot 实战:从 Driver 到 Repository 的整合与踩坑
java·数据库·spring boot·后端·spring·nosql·neo4j