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

    }
}
相关推荐
微笑听雨9 分钟前
Java 设计模式之单例模式(详细解析)
java·后端
微笑听雨9 分钟前
【Drools】(二)基于业务需求动态生成 DRL 规则文件:事实与动作定义详解
java·后端
猫猫的小茶馆28 分钟前
【STM32】FreeRTOS 任务的删除(三)
java·linux·stm32·单片机·嵌入式硬件·mcu·51单片机
天天摸鱼的java工程师33 分钟前
🔧 MySQL 索引的设计原则有哪些?【原理 + 业务场景实战】
java·后端·面试
空影学Java1 小时前
Day44 Java数组08 冒泡排序
java
追风少年浪子彦1 小时前
mybatis-plus实体类主键生成策略
java·数据库·spring·mybatis·mybatis-plus
创码小奇客2 小时前
Talos 使用全攻略:从基础到高阶,常见问题一网打尽
java·后端·架构
jackzhuoa2 小时前
java小白闯关记第一天(两个数相加)
java·算法·蓝桥杯·期末
Rover.x2 小时前
内存泄漏问题排查
java·linux·服务器·缓存
midsummer_woo2 小时前
基于spring boot的纺织品企业财务管理系统(源码+论文)
java·spring boot·后端