使用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();
        }

    }
}
相关推荐
失散139 小时前
分布式专题——10.1 ShardingSphere介绍
java·分布式·架构·shardingsphere·分库分表
记得开心一点嘛9 小时前
手搓Tomcat
java·tomcat
lightqjx10 小时前
【C++】string类 模拟实现
java·开发语言·c++
echoyu.10 小时前
初识微服务-nacos配置中心
java·微服务
只_只10 小时前
B1013 PAT乙级JAVA题解 数素数
java·开发语言
喜欢你,还有大家10 小时前
Nginx服务——安装与搭建
java·服务器·nginx
小玉起起10 小时前
IntelliJ IDEA 2025.1 Java Stream Debugger 快速使用指南
java·intellij-idea·idea
龙卷风040510 小时前
SpringAI调用第三方模型增加自定义请求参数
java·后端
java1234_小锋10 小时前
RabbitMQ如何实现消息的持久化?
java·rabbitmq·java-rabbitmq
千册10 小时前
pyside6 的pdf显示测试 -- 01
开发语言·python·pdf