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

    }
}
相关推荐
蓝斯4974 小时前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加贝塞尔曲线,上、下、左、右连接点
java·c#·流程图
前端工作日常5 小时前
我学习到的Java 的 Service 分层:itf 和 impl 到底是什么?
java·后端
都叫我大帅哥5 小时前
Spring @Transactional 注解完全指南
java·spring
Java成神之路-5 小时前
G1 垃圾回收器 :SATB + TAMS核心机制深度解析
java·jvm
前端工作日常6 小时前
我学习到的JIT即时编译与机器码缓存失效
java·后端
带刺的坐椅6 小时前
Solon 的 10 种 HTTP 服务器:改一行依赖,换一个引擎
java·solon·jetty·undertow·mcp-server·htttp
xcLeigh7 小时前
Go入门:变量声明的五种方式详解
java·开发语言·golang
AI大模型-小华7 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
Mark_ZP7 小时前
【锁1】Synchronized vs ReentrantLock区别
java
立心者08 小时前
SpringBoot中使用TOTP实现MFA(多因素认证)
java·spring boot·后端