当前位置: 首页 > news >正文

【工具类】PDF文件转图片

PDF文件转文件

1. 引入Maven依赖

主要使用了 pdfbox 包与 hutool 包。
pdfbox 负责 pdf 到图片的转换;
hutool 负责文件读取转换。

<dependency>
	<groupId>org.apache.pdfbox</groupId>
	<artifactId>pdfbox</artifactId>
	<version>2.0.27</version>
</dependency>
<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>5.8.34</version>
</dependency>
2. 代码实现

主要思路:
pdfbox 提供了操作输入流与操作字节数组的两种方式。

2.1 字节数组
public void pdf2Image() {
	// 这边简单采用读取本地文件的形式
    File file = new File("");
    File outFile = new File("");
    byte[] bytes = FileUtil.readBytes(file);

    String formatName = "png";

    try (PDDocument document = PDDocument.load(bytes)) {
        PDFRenderer pdfRenderer = new PDFRenderer(document);
        int numberOfPages = document.getNumberOfPages();

        // 将 BufferedImage 转换为字节数组
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        for (int i = 0; i < numberOfPages; i++) {
            // 渲染第一页为 BufferedImage
            BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(0, 50);
            ImgUtil.write(bufferedImage, formatName, baos);
        }

        OutputStream outputStream = new FileOutputStream(outFile);
        baos.writeTo(outputStream);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

通过字节数组可实现 pdf 文件转换为图片,但是这个代码在处理大文件时会一次性把文件读进内存导致内存溢出

2.2 文件流
public void pdf2Image() {
    File file = new File("");
    File outFile = new File("");
    String formatName = "png";

    try (InputStream is = new BufferedInputStream(new FileInputStream(file))) {
        PDDocument document = PDDocument.load(is, MemoryUsageSetting.setupTempFileOnly());
        PDFRenderer pdfRenderer = new PDFRenderer(document);
        int numberOfPages = document.getNumberOfPages();

        // 将 BufferedImage 转换为字节数组
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        for (int i = 0; i < numberOfPages; i++) {
            // 渲染第一页为 BufferedImage
            BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(0, 50);
            ImgUtil.write(bufferedImage, formatName, baos);
        }

        OutputStream outputStream = new FileOutputStream(outFile);
        baos.writeTo(outputStream);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

相关文章:

  • 计算机网络 第一章:计算机网络和因特网(1)
  • CMake学习笔记(三):静态库,动态库的生成和使用
  • Python基础入门掌握(十三)
  • Linux应用:程序运行
  • ESP32学习 -从STM32工程架构进阶到ESP32架构
  • C++基础 [五] - String的模拟实现
  • 本地部署 RAGFlow - 修改默认端口
  • 基于javaweb的SpringBoot校园运动会管理系统设计与实现(源码+文档+部署讲解)
  • 其利天下技术·伺服电机在机器人技术中的应用
  • 深度解析ECharts.js:构建现代化数据可视化的利器
  • 1536数字三角形
  • 【位运算】速算密钥:位运算探秘
  • 深度剖析:Pytest Fixtures如何重塑自动化测试的可读性与高效性
  • ⭐算法OJ⭐克隆图【BFS】(C++实现)Clone Graph
  • 对项目进行优化
  • JMeter 性能测试
  • 工业省电空调降温原理
  • 边缘云原生操作系统的设计与思考
  • Hadoop集群组成
  • pyyaml_include 2.x 版本使用说明
  • 产假工资是谁出?女职工生育能领多少生育津贴?解答来了
  • 党政机关停车场免费、食堂开放,多地“五一”游客服务暖心周到
  • 2025财政观察①长三角罚没收入增速放缓,24城仍在上涨
  • 五一假期上海口岸出入境客流总量预计达59.4万人,同比增约30%
  • 图忆|上海车展40年:中国人的梦中情车有哪些变化(上)
  • 江西德安回应“义门陈遗址建筑被没收”:将交由规范的义门陈相关社会组织管理