Java PDFBox 提取页数、PDF转图片

PDF 提取

使用Apache 的pdfbox组件对PDF文件解析读取和转图片。

Maven 依赖

导入下面的maven依赖:

xml 复制代码
<dependency>
	<groupId>org.apache.pdfbox</groupId>
	<artifactId>pdfbox</artifactId>
    <version>2.0.30</version>
</dependency>

读取总页数 和 转图片

dpi越大转换后越清晰,相对转换速度越慢,建议取值500-800。

图片类型可以选择jpg或者png:

  1. jpg图片大小比png要小很多
  2. jpg图片转换速度比png快
  3. 相同dpi jpg和png清晰度差别不大
java 复制代码
package tech.pplus.common.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.springframework.web.util.UriComponentsBuilder;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.LinkedList;
import java.util.List;

/**
 * @author zl
 * @date 2024-01-24
 */
@Slf4j
public class PDFUtil {
    /**
     * dpi越大转换后越清晰,相对转换速度越慢
     */
    private static final Integer DPI = 500;
    private static final String IMG_SUFFIX = "jpg";

    /**
     * pdf 一页切分 一张图片
     *
     * @param url pdf文件url
     * @param dstDir 图片输出目录
     * @return
     */
    public static List<File> splitPage(String url, String dstDir) {
        dstDir = dstDir.endsWith(File.separator) ? dstDir : dstDir + File.separator;
        List<File> files = new LinkedList<>();
        try (InputStream is = new URL(url).openConnection().getInputStream();
             PDDocument document = PDDocument.load(is)) {
             //获取总页数
            int numberOfPages = document.getNumberOfPages();

            PDFRenderer renderer = new PDFRenderer(document);
            //提取url文件名称
            String path = UriComponentsBuilder.fromHttpUrl(url).build().getPath();
            String fileName = path.substring(path.lastIndexOf("/") + 1);
            for (int i = 0; i < numberOfPages; i++) {
                File dstFile = new File(dstDir + fileName + String.format(".page%d.%d.%s", i + 1, DPI, IMG_SUFFIX));
                //把页面转图片
                BufferedImage image = renderer.renderImageWithDPI(i, DPI);
                ImageIO.write(image, IMG_SUFFIX, dstFile);
                files.add(dstFile);
            }

        } catch (IOException e) {
            log.error("PDF分割异常,url={},destDir={},error={}", url, dstDir,e.getMessage(), e);
        }
        return files;
    }
}

测试参数:

  1. pdfUrl:https://s3.us-west-1.amazonaws.com/tax.withtutti.com/test/upload/202401/83610d194d2d48498afa9451e39b198d.pdf
  2. dstDir: /tmp

输出结果:


相关推荐
源图客几秒前
【亚马逊 SP-API 实战】Java 批量创建变体 Listing(父商品 + 子变体 + 独立图片)完整教程(亲测可用)
java·大数据·python
茫忙然1 分钟前
Claude Code 接入 DeepSeek 或 多模型 教程(Linux)
java·linux·数据库
兰令水1 小时前
leecodecode【反前后指针】【2026.5.31打卡-java版本】
java·开发语言
AI人工智能+电脑小能手9 小时前
【大白话说Java面试题 第87题】【Mysql篇】第17题:分布式事务的实现原理?
java·数据库·分布式·mysql·面试
来杯@Java9 小时前
图书管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·mybatis·课程设计
卷毛的技术笔记10 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
编程大师哥10 小时前
匿名函数 lambda + 高阶函数
java·python·算法
東雪木11 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
adrninistrat0r11 小时前
Java调用链MCP分析工具
java·python·ai编程
噜噜噜阿鲁~11 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言