使用Apache PDFBox将pdf文件转换为图片

一、引入依赖

XML 复制代码
		<dependency>
			<groupId>org.apache.pdfbox</groupId>
			<artifactId>pdfbox</artifactId>
			<version>2.0.24</version>
		</dependency>
		<dependency>
			<groupId>org.apache.pdfbox</groupId>
			<artifactId>pdfbox-tools</artifactId>
			<version>2.0.24</version>
		</dependency>

二、每页进行转换

1、代码示例

java 复制代码
package com.xiaobai.pdf2img;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.junit.jupiter.api.Test;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * @Author 王天文
 * @Date 2025/1/2 21:51
 * @Description: pdf文件转图片
 */
public class Pdf2ImgTest {

    @Test
    public void pdf2Img() {

        // pdf文件路径
        String pdfPath = "D:\\temp\\信息报送流程.pdf";
        // 图片目录
        String imgDir = "D:\\temp\\img\\";

        // 加载pdf文件
        try(PDDocument pdDocument = PDDocument.load(new File(pdfPath))) {
            PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);

            for (int i = 0; i < pdDocument.getNumberOfPages(); i++) {
                // 渲染图像
                BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(i, 500);

                File imageFile = new File(imgDir + "page-" + (i + 1) + ".png");
                // 保存为png格式
                ImageIO.write(bufferedImage, "PNG", imageFile);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

2、说明

***org.apache.pdfbox.rendering.PDFRenderer#renderImageWithDPI(int, float)***根据指定的DPI将pdf页面渲染成图像。DPI值越大,渲染越清晰,转换速度越慢。

三、pdf文件转换成长图

1、实现思路

根据pdf文件路径加载文件,对pdf文件的每页进行图像渲染,根据所有图像的高度计算长图片的高度,获取到所有图像的最大宽度即为长图片的宽度,使用java.awt.Graphics2D将所有图像渲染到长图片上。

2、代码示例

java 复制代码
package com.xiaobai.pdf2img;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.junit.jupiter.api.Test;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;

/**
 * @Author 王天文
 * @Date 2025/1/2 22:23
 * @Description: pdf文件转换成长图
 */
public class Pdf2MergeImgTest {

    @Test
    public void pdf2Img() {
        // pdf文件路径
        String pdfPath = "D:\\temp\\信息报送流程.pdf";
        // 图片目录
        String imgPath = "D:\\temp\\img\\mergeImg.png";

        // 长图片高度
        int totalHeight = 0;
        // 长图片宽度
        int maxWidth = 0;
        // 加载pdf文件
        try(PDDocument document = PDDocument.load(new File(pdfPath))) {
            PDFRenderer pdfRenderer = new PDFRenderer(document);

            BufferedImage[] bufferedImages = new BufferedImage[document.getNumberOfPages()];
            // pdf文件的每页转换成BufferedImage
            for (int i = 0; i < document.getNumberOfPages(); i++) {
                // 根据dpi渲染图片
                BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(i, 500);
                bufferedImages[i] = bufferedImage;

                // 高度
                totalHeight += bufferedImage.getHeight();

                // 宽度
                if (maxWidth < bufferedImage.getWidth()) {
                    maxWidth = bufferedImage.getWidth();
                }
            }

            /*合并图片*/
            BufferedImage mergeImage = new BufferedImage(maxWidth, totalHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = mergeImage.createGraphics();

            int currentHeight = 0;
            for (BufferedImage bufferedImage : bufferedImages) {
                g.drawImage(bufferedImage, 0, currentHeight, null);
                currentHeight += bufferedImage.getHeight();
            }

            // 保存长图片
            ImageIO.write(mergeImage, "PNG", new File(imgPath));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
相关推荐
鸿永与29 分钟前
『SQLite』常见数据类型(动态类型系统)
java·数据库·sqlite
一弓虽1 小时前
java基础学习——java泛型
java·学习
我真不会起名字啊1 小时前
QtJson数据格式处理详解
java·前端·javascript
硕风和炜2 小时前
【LeetCode: 112. 路径总和 + 二叉树 + 递归】
java·算法·leetcode·面试·二叉树·递归
Xwzzz_2 小时前
基于Redisson实现重入锁
java·redis·lua
吴冰_hogan3 小时前
并发编程之CAS与Atomic原子操作详解
java·开发语言·数据库
风月歌3 小时前
基于Web的足球青训俱乐部管理后台系统的设计与开发源码(springboot+mysql+vue)
java·前端·spring boot·后端·mysql·mybatis·源码
小白起 v3 小时前
三天速成微服务
java·运维·微服务
叶 落3 小时前
Ubuntu 下载安装 Consul1.17.1
java·服务器·ubuntu·中间件·consul·配置中心
计算机-秋大田3 小时前
基于Spring Boot的社区老人健康信息管理系统的设计与实现(LW+源码+讲解)
java·spring boot·后端·课程设计