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

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

一、引入依赖

		<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、代码示例

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、代码示例

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

    }
}


http://www.kler.cn/a/464199.html

相关文章:

  • 从零开始RTSP协议的实时流媒体拉流(pull)的设计与实现(一)
  • 电子电气架构 --- 中央HPC架构
  • 玩客云docker修复(docker安装)
  • UE5.3 虚幻引擎 Windows插件开发打包(带源码插件打包、无源码插件打包)
  • 游戏如何检测iOS越狱
  • 线性代数自学资源推荐我的个人学习心得
  • Java重要面试名词整理(二十一):SpringSecurity
  • Python爬虫基础——百度新闻页面结构剖析
  • MySQL:安装配置(完整教程)
  • 散度与旋度的探讨
  • 《ChatGPT介绍》
  • TCP/IP 教程
  • Flink源码解析之:如何根据JobGraph生成ExecutionGraph
  • uniapp H5 对接 声网,截图
  • 【技术新浪潮】DeepSeek-V3:中国AI的开源巨浪,全球AI格局的破局者
  • C# 设计模式:装饰器模式与代理模式的区别
  • 力扣hot100——二叉树
  • 高效使用AI完成编程项目任务的指南:从需求分析到功能实现
  • 华为OD E卷(100分)45-喊7的次数重排
  • 【网站推荐】IP反查域名实战
  • leetcode 729. 我的日程安排表 I 中等
  • 小程序配置文件 —— 15 页面配置
  • 【2024美国数学建模AB题原文翻译】
  • 基于QT(C++)实现的坦克大战
  • 力扣刷题:栈和队列OJ篇(下)
  • 力扣-数据结构-10【算法学习day.81】