Java快速实现PDF转图片功能实例代码

 更新时间:2024年09月25日 09:12:41   作者:知识浅谈  
PDFBox是一个开源Java类库,用于读取和创建PDF文档,它支持文本提取、表单处理、文档加密解密、合并分割、内容覆盖追加、文档打印和转换等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

PDFBox是一个BSD许可下的源码开放项目,它是一个专门为开发人员读取和创建PDF文档而准备的纯Java类库。

  • 文本提取:PDFBox可以从PDF文档中提取文本,包括Unicode字符。
  • 表单处理:PDFBox支持从PDF表单中提取数据,或者是填充PDF表单。
  • 加密与解密:可以对PDF文档进行加密和解密操作。
  • 合并与分割:可以将多个PDF文档合并成一个,也可以将一个PDF文档分割成多个。
  • 覆盖与追加:可以覆盖PDF文档的内容,或者向已有的PDF文档中追加内容。
  • 打印:利用Java的打印API,PDFBox可以将PDF文档输出到打印机。
  • 转换:PDFBox可以将PDF文档转换成映像文件,如PNG或JPEG格式。
  • 创建PDF:可以从头开始创建新的PDF文档,包括添加图像和字体。
  • 集成Lucene搜索引擎:PDFBox与Jakarta Lucene等文本搜索引擎的整合过程十分简单,可以用于PDF文档的索引和搜索。

引入依赖

<!--pdf转图片-->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.29</version>
</dependency>

编写PdfToImageUtil 工具类

import lombok.extern.slf4j.Slf4j;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: 公众号:知识浅谈
 * @Description: pdf转图片工具类
 * @Version: 1.0
 */
@Slf4j
public class PdfToImageUtil {
    /*dpi 越大图片越清晰*/
    private static final Integer DPI = 100;

    /*转换后图片类型*/
    private static final String IMG_TYPE = "jpg";

    /**
     * PDF转图片(多页)
     * @param fileContent pdf文件的二进制流
     * @return 图片文件的二进制流
     * @throws Exception
     */
    public static List<byte[]> pdfToImage(byte[] fileContent) throws Exception {
        List<byte[]> imageList = new ArrayList<byte[]>();
        PDDocument document=null;
        try{
            document = PDDocument.load(fileContent);
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            for (int i = 0; i < document.getNumberOfPages(); i++) {
                BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(i, DPI);
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                ImageIO.write(bufferedImage, IMG_TYPE, out);
                imageList.add(out.toByteArray());
            }
        }finally {
            document.close();
        }
        return imageList;
    }


    /**
     * PDF转图片(单页)
     * @param fileContent pdf文件的二进制流
     * @return 图片文件的二进制流
     * @throws Exception
     */
    public static byte[] pdfToImageOne(byte[] fileContent) throws Exception {
        byte[] image = null;
        PDDocument document=null;
        try{
            document = PDDocument.load(fileContent);
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(0, DPI);
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, IMG_TYPE, out);
            image = out.toByteArray();
        }finally {
            document.close();
        }
        return image;
    }

    public static Boolean saveImage(byte[] imageBytes, String savePath,String fileName) throws Exception {
        try {
            BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes));
            File directory = new File(savePath);
            if(!directory.exists()){
                directory.mkdirs();
            }
            File file1 = new File(directory,fileName);
            return ImageIO.write(image, IMG_TYPE, file1);
        } catch (IOException e) {
            log.error("保存文件错误");
            return false;
        }
    }
}

方法实现

 * pdf转图片
 */
@GetMapping(value = "/pdfToPng")
@Log(title = "证件模板", businessType = BusinessType.OTHER)
public void pdfToPng(HttpServletRequest request,HttpServletResponse response) {
    try {
        File file = new File("D:\\pdf\\test.pdf");
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] pdfBytes = new byte[(int) file.length()];
        fileInputStream.read(pdfBytes);
        fileInputStream.close();

        byte[] bytes = PdfToImageUtil.pdfToImageOne(pdfBytes);
        ServletOutputStream outputStream = response.getOutputStream();
        response.setContentType("image/jpeg");
        response.setContentLength(bytes.length);
        outputStream.write(bytes);
    }catch (Exception e){
        log.error("pdf转图片异常{}", e.getMessage());
    }
}

运行之后显示的结果如下

总结 

到此这篇关于Java快速实现PDF转图片功能的文章就介绍到这了,更多相关Java PDF转图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Cloud Hystrix 服务降级限流策略详解

    Spring Cloud Hystrix 服务降级限流策略详解

    这篇文章主要为大家介绍了Spring Cloud Hystrix 服务降级限流策略详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Spring事务框架之TransactionStatus源码解析

    Spring事务框架之TransactionStatus源码解析

    这篇文章主要为大家介绍了Spring事务框架之TransactionStatus源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Spring Boot 整合 Mockito提升Java单元测试的高效实践案例

    Spring Boot 整合 Mockito提升Java单元测试的高效实践案例

    Mockito与Spring Boot的整合为Java开发者提供了一套完整的解决方案,使得单元测试更为精准、高效,从而确保了代码质量、降低了维护成本,并促进了项目的持续集成与交付,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • Mybatis Plus LambdaQueryWrapper的具体用法

    Mybatis Plus LambdaQueryWrapper的具体用法

    Mybatis Plus 在其基础上扩展了 LambdaQueryWrapper,LambdaQueryWrapper 提供了更加简便的查询语法,同时也避免了SQL注入的风险,感兴趣的可以了解一下
    2023-11-11
  • 剑指Offer之Java算法习题精讲数组与字符串

    剑指Offer之Java算法习题精讲数组与字符串

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03
  • SpringBoot项目jar依赖问题报错解析

    SpringBoot项目jar依赖问题报错解析

    本文主要介绍了Spring Boot项目中常见的依赖错误类型、报错内容及解决方法,依赖冲突包括类找不到、方法找不到、类型转换异常等,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Java CAS底层实现原理实例详解

    Java CAS底层实现原理实例详解

    这篇文章主要介绍了Java CAS底层实现原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java方法及数组相关原理解析

    Java方法及数组相关原理解析

    这篇文章主要介绍了Java方法及数组相关原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • springboot项目中idea的pom.xml文件的引用标签全部爆红问题解决

    springboot项目中idea的pom.xml文件的引用标签全部爆红问题解决

    这篇文章主要介绍了springboot项目中idea的pom.xml文件的引用标签全部爆红问题解决,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧
    2023-12-12
  • spring security获取用户信息的实现代码

    spring security获取用户信息的实现代码

    这篇文章主要介绍了spring security获取用户信息的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12

最新评论