首页 > 编程语言 >java PDF转换图片(多张pdf转换成一整张图片)

java PDF转换图片(多张pdf转换成一整张图片)

时间:2024-05-17 11:09:17浏览次数:21  
标签:load java image bufferedImage BufferedImage new 一整张 bufferedImages 图片

  1. 引入pdf操作相关pom
	<dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.21</version>
        </dependency>
  1. 具体代码
    @RequestMapping(params = "fileToImg")
    public void fileToImg(String ossPath, HttpServletResponse response) {
	//endpoint、accessKeyId、secretAccessKey需要改为自己的配置
        OSS ossClient = new OSSClientBuilder().build(OssConfig.endpoint.getName(), OssConfig.accessKeyId.getName(), OssConfig.accessKeySecret.getName());
        OSSObject object = ossClient.getObject(OssBucketEnum.BASEWEB.getBucketName(), ossPath);
        try (PDDocument load = PDDocument.load(object.getObjectContent())) {
            PDFRenderer pdfRenderer = new PDFRenderer(load);
            int resolution = 300;
            ImageType type = ImageType.RGB;
            List<BufferedImage> bufferedImages = Lists.newArrayList();
            for (int i = 0; i < load.getNumberOfPages(); i++) {
                BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(i, resolution, type);
                bufferedImages.add(bufferedImage);
            }
            BufferedImage image = new BufferedImage(bufferedImages.stream().map(BufferedImage::getWidth).max(Comparator.naturalOrder()).orElse(0),
                    bufferedImages.stream().map(BufferedImage::getHeight).reduce(Integer::sum).orElse(0), BufferedImage.TYPE_INT_RGB);
	    //将多张图片拼接成一张长图
            Graphics2D graphics = image.createGraphics();
	    //每张图片绘画的起始高度
            int currentHeight = 0;
            for (BufferedImage bufferedImage : bufferedImages) {
                graphics.drawImage(bufferedImage, 0, currentHeight, null);
                currentHeight += bufferedImage.getHeight();
            }
            graphics.dispose();
            response.setContentType("image/png");
	    //返回文件名称处理
            String ossFileName = ossPath.split("/")[1];
	    String fileName=URLUtil.encode(ossFileName.substring(0,ossFileName.lastIndexOf("."))+".png");
            response.setHeader("Content-Disposition", "attachment; filename="+ fileName);
            ImageIO.write(image, "png", response.getOutputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            Optional.of(ossClient).ifPresent(OSS::shutdown);
        }
    }

标签:load,java,image,bufferedImage,BufferedImage,new,一整张,bufferedImages,图片
From: https://www.cnblogs.com/wyxazgye/p/18197487

相关文章

  • labelme去除空图片
    Labelme是一个用于图像标注的开源工具。在使用Labelme进行数据标注后,可能会生成一些空的图像文件(即没有进行标注的图片),这些空图片通常不应该被使用。以下是一个简单的Python脚本,用于检测和删除这些空的标注文件:点击查看代码importosimportjsondefis_image_empty(image_p......
  • Java枚举类
    一、使用场景:什么情况下使用枚举类?有的时候一个类的对象的个数是固定的,这种情况下我们就应该用枚举类来表示这个类。比如表示星期,就可以将Week定义为一个枚举类,同时为Week枚举类创建七个对象。再比如表示季节,就可以将Season定义为一个枚举类,同时为Season枚举类创建四个对象。......
  • java01基础入门
    java01基础入门准备javac-versionjava-versioncd..//回到上一级勾选文件扩展名设置Path环境变量IDEA创建工程开发步骤project->module->package->class设置主题、字体快捷键注释关键字基本组成:由数字、字母、下划线(_)和美元符($)等组......
  • 一个Java基于codePoint的emoji判断方法
    该方法参考自一篇博客java判断是否是emoji字符(史上最全)_Mr.QingBin的博客-CSDN博客_java判断emoji经过简单封装如下:publicclassEmojiFilter{privateEmojiFilter(){}/***过滤emoji或者其他非文字类型的字符*如果只需要判断是否含有emoji,使用hasEmoji......
  • 一个Java基于阻塞的定时消费内存队列
     @Getter@AllArgsConstructorpublicenumInsertQueueEnum{A(30000,10,TimeUnit.SECONDS,2,1000),;privatefinalintcapacity;//队列长度privatefinalinttime;//最长阻塞时间privatefinalTimeUnittimeUnit;//最长阻塞时间单位privatefi......
  • Java 网络编程(socket)
    概念:1.什么是网络编程?  计算机跟计算机之间通过网络进行数据传输。2.通信的软件架构C/S与B/S的区别?  C/S:客户端/服务端模式(需要开发客户端)  B/S:浏览器/服务端模式(不需要开发客户端)  网络编程三要素:1.IP     设备在网络中的地址,是唯一的标识2.......
  • hdu1176免费馅饼java
    一个数塔问题,以时间为纵坐标、位置为横坐标创建一个二维数组,然后从下往上相加。状态转移方程:9>=j>=1时dp[i][j]+=max(max(dp[i+1][j],dp[i+1][j+1]),dp[i+1][j-1])  j=0时 dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]) j=10时dp[i][j]+=......
  • 语雀导入.md图片丢失解决办法
    直接在语雀中导入.md文件会出现图片丢失问题,可以把.md文件和存放图片相关文件夹一起压缩成zip再导入就可以解决这个问题例如:我们想把这个C语言课件导入到语雀中,就可以 C语言课件压缩成一个zip再导入到语雀中 还是选择原来的导入类型  然后选择刚才压缩的文件导入可......
  • Java-并发-ReentrantLock
    0.是什么ReentrantLock是java.util.concurrent.locks包中的一个类,提供了比synchronized关键字更灵活和强大的锁机制。ReentrantLock实现了Lock接口,它允许显式地加锁和解锁,并提供了一些高级功能,如中断锁请求、超时锁请求、公平锁和非公平锁选择等。1.为什么在Java诞生......
  • Java-线程-wait()、notify()和notifyAll()
    0.是什么(What)wait(),notify(),和notifyAll()方法都是Object类的一部分,用于实现线程间的协作。1.为什么(Why)线程的执行顺序是随机的(操作系统随机调度的,抢占式执行),但是有时候,我们希望的是它们能够顺序的执行。所以引入了这几个方法,使得我们能保证一定的顺序。1.1Objec类......