首页 > 编程语言 >Java SpringBoot 图片转PDF示例

Java SpringBoot 图片转PDF示例

时间:2025-01-06 15:55:50浏览次数:1  
标签:文件 Java file 示例 File import PDF com

一个SpringBoot工程里面用到了第三方签章服务,支持PDF多页盖章,用户上传的是多张图片格式的文件,所以需要将图片转成PDF。

用了几个扩展包,出现过版本不兼容、转完的PDF带水印、还有操作复杂的。 最后借助 aspose-pdf 这个扩展包实现了,这里记录一下简单的 Demo。

pom.xml 文件引入 aspose-pdf 依赖

<dependencies>
  ...
  <dependency>
      <groupId>com.luhuiguo</groupId>
      <artifactId>aspose-pdf</artifactId>
      <version>23.1</version>
  </dependency>
  ...
 </dependencies>

创建一个 FileUtils 工具类文件 FileUtils.java

package com.cnblog.imgtopdf.util;

import com.aspose.pdf.Document;
import com.aspose.pdf.Image;
import com.aspose.pdf.Page;
import com.aspose.pdf.Rectangle;
import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.net.URL;

@Slf4j
public class FileUtils {
    
    /**
     * 根据文件路径获取文件
     * @param filePath 文件路径
     * @return File
     */
    public static File getFileByPath(String filePath) {
        log.info("------------开始获取图片文件------------");
        // 拆分路径,获取文件后缀名
        String[] split = filePath.substring(filePath.lastIndexOf("/") + 1).split("\\.");
        
        File file = null;
        URL url;
        InputStream inStream = null;
        OutputStream os = null;
        try {
            // 创建临时文件,使用路径名称和路径后缀名
            file = File.createTempFile(split[0], "." + split[1]);
            url = new URL(filePath);
            inStream = url.openStream();
            os = new FileOutputStream(file);
            
            int bytesRead;
            int byteSize = 1024 * 528;
            byte[] buffer = new byte[byteSize];
            // 写入文件
            while ((bytesRead = inStream.read(buffer, 0, byteSize)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            log.info("------------获取图片文件完成------------");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os) {
                    os.close();
                }
                if (null != inStream) {
                    inStream.close();
                }
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return file;
    }
    
    /**
     * 图片转PDF
     * @param file 图片文件
     * @return File PDF文件
     */
    public static File imgToPdfFile(File file) {
        log.info("------------开始执行图片转PDF------------");
        // 获取classpath,还可使用临时文件夹
        String pdfPath = ClassLoader.getSystemResource("").getPath();
        String pdfName = "demo.pdf";
        try {
            String pdfFilePath = pdfPath + pdfName;
            // 创建一个新文档
            Document doc  = new Document();
            // 将页面添加到文档的页面集合
            Page page = doc.getPages().add();
            // 将图像加载到流中
            java.io.FileInputStream imageStream = new java.io.FileInputStream(file.getPath());
            // 设置边距,以便图像适合等。
            page.getPageInfo().getMargin().setBottom(0);
            page.getPageInfo().getMargin().setTop(200);
            page.getPageInfo().getMargin().setLeft(200);
            page.getPageInfo().getMargin().setRight(0);
            page.setCropBox(new Rectangle(0, 0, 595, 842));
            // 创建图像对象
            Image image1 = new Image();
            // 将图像添加到该部分的段落集合中
            page.getParagraphs().add(image1);
            // 设置图片文件流
            image1.setImageStream(imageStream);
            // 保存生成的 PDF 文件
            doc.save(pdfFilePath);
            //输出流
            File mOutputPdfFile = new File(pdfFilePath);
            // 判断临时文件否存在,如果存在可选择删除
            if (!mOutputPdfFile.exists()) {
                mOutputPdfFile.deleteOnExit();
                return null;
            }
            doc.close();
            log.info("------------图片转PDF执行完成------------");
            return mOutputPdfFile;
        } catch (IOException e) {
            log.error("图片转PDF失败:file:{}, error:{}", file.getPath(), e.getMessage());
        }
        return null;
    }
}

最后写一个测试类 ImgToPdfTest ,用这个博客的头像试试效果:

package com.cnblog.imgtopdf.impl;

import com.cnblog.imgtopdf.util.FileUtils;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.File;

@Slf4j
@SpringBootTest
class ImgToPdfTest {

    @Test
    public void imgToPdf(){
        
        String imgPath = "https://pic.cnblogs.com/avatar/2319511/20210331180835.png";
        File file = FileUtils.getFileByPath(imgPath);
        FileUtils.imgToPdfFile(file);
    }
}

执行结果及文件位置:

预览转换完成的PDF文件:

还可以根据需求设置不一样的转换参数,包括间距,画布大小等。

本篇代码Github:https://github.com/Journeyerr/cnblogs/tree/master/imgToPdf

 

标签:文件,Java,file,示例,File,import,PDF,com
From: https://www.cnblogs.com/anyuan/p/18655465

相关文章

  • 设计模式七大设计原则Java 实践
    1.单一职责原则(SingleResponsibilityPrinciple,SRP)单一职责原则规定一个类应该仅对一项职责负责。这意味着一个类应只关注一件事情,以便降低类之间的耦合度,提高代码的可维护性。示例://用户登录类publicclassUserLogin{publicbooleanlogin(Stringusername,S......
  • 2024实测验证可用的股票数据接口集合:python、JavaScript 、JAVA等实例代码演示教你如
    最近一两年,股票量化分析越来越受欢迎了。想要入行,首先得搞定股票数据。毕竟,所有量化分析都是建立在数据之上的,实时交易、历史交易、财务、基本面,这些数据咱们都得有。咱们的目标就是挖掘这些数据中的价值,来指导咱们的投资策略。为了找数据,我可是尝试了各种方法,自己动手写过......
  • java和集合和JVM
    Java语言有哪些特点?面向对象(封装,继承,多态),平台无关性(Java虚拟机实现平台无关性),可靠性(具备异常处理和自动内存管理机制)。.java文件(java源代码文件)经javac编译器编译成.class文件(字节码文件)JVM类加载器再加载字节码文件,解释器逐行解释执行;OpenJDK开源;Java和C++的区别?......
  • uni-app开发app端pdf.js展示文件流
    需求背景有些PDF文件想要可以在app中查看预览,并且可以分享到微信,但是又不想让人直接获得文件存储地址,所以才用了文件流形式返回数据,(属实搞的焦头烂额)话不多说我们直接开始。引入PDF.js插件PDF.js-入门点击上面网址打开后选择右侧下载下载完成后解压会得到web和build两个......
  • 古玩玉器交易系统|Java|SSM|VUE| 前后端分离
                 【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apachetomcat......
  • 固定资产管理系统|Java|SSM|VUE| 前后端分离
                 【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apachetomcat......
  • 共享充电宝系统|Java|SSM|VUE| 前后端分离
                 【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apachetomcat......
  • 个性化电影推荐系统|Java|SSM|JSP|
                 【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apachetomcat......
  • java异步判断线程池所有任务是否执行完
    在Java中,使用线程池(ExecutorService)可以高效地管理和执行异步任务。对于某些应用场景,可能需要异步地判断线程池中所有任务是否执行完毕。以下是一个高度专业的指南,讲解如何在Java中实现这一功能。步骤概述创建并配置线程池。提交多个异步任务到线程池。使用 CompletionServi......
  • 《重构:改善既有代码的设计(第2版)》PDF、EPUB免费下载
    电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍点击原文去下载书籍信息作者:[美]MartinFowler出版社:人民邮电出版社出品方:异步图书副标题:改善既有代码的设计原作名:Refactoring:ImprovingtheDesignofExistingCode,SecondEdition......