从PDF中提取图片

由于工作需要,要从pdf文件中提取出图片保存到本地,项目中就引用到了Apache PDFBox库。

1 什么是Apache PDFBox?

Apache PDFBox库 ,一个用于处理PDF文档的开源Java工具。它允许用户创建全新的PDF文件,操作现有的PDF文档,以及从PDF文件中提取内容等。

1.1 Apache PDFBox的主要功能

  • Extract Text:从PDF文件中提取Unicode文本。
  • Split & Merge:将单个PDF拆分成多个文件,或将多个PDF文件合并为一个文件。
  • Fill Forms:从PDF表单中提取数据或填写PDF表单。
  • Preflight:根据PDF/A-1b标准验证PDF文件。
  • Print:使用标准Java打印API打印PDF文件。
  • Save as Image:将pdf文件保存为图像文件,如PNG或JPEG。
  • Create PDFs:从头开始创建新的PDF文件,包含嵌入字体和图像。
  • Signing:对PDF文件进行数字签名。

1.2 Apache PDFBox的组件

1.3 Apache PDFBox相关依赖

PDFBox版本 JDK最低版本 Maven版本
PDFBox4.0.0-SNAPSHOT JDK 11 Maven 3
PDFBox 3.0.x JDK 8 (目前测试进行到Java 19) Maven 3
PDFBox 2.0.x JDK 7 Maven 3

2 从pdf中提取图片代码实现

2.1 SpringBoot工程引入依赖

该SpringBoot项目使用Java8。

XML 复制代码
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.21</version>
</dependency>

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.29</version>
</dependency>

2.2 测试代码

java 复制代码
import org.apache.pdfbox.cos.COSName;  
import org.apache.pdfbox.pdmodel.PDDocument;  
import org.apache.pdfbox.pdmodel.PDPage;  
import org.apache.pdfbox.pdmodel.PDResources;  
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;  
  
import javax.imageio.ImageIO;  
import java.awt.image.BufferedImage;  
import java.io.File;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.util.Iterator;

public class PdfGetJpg {

    public static void main(String[] args) {
        // 创建文件对象
        File file = new File("C:\\test.pdf");
        export(file);
    }

    private static void export(File file) {
        String fileName = file.getName().substring(0, file.getName().indexOf('.'));

        PDDocument document = null;

        try {
            //解析PDF并加载
            document =  PDDocument.load(file);
            //获取索引为0的页面(也就是获取第一页)
            PDPage page = document.getPage(0); // 可以通过获取页数进行循环每一页
            //获取页面所需的任何资源的字典
            PDResources resources = page.getResources();
            //返回XObject资源的名称
            Iterable<COSName> cosNames = resources.getXObjectNames();
            if(cosNames != null) {
                Iterator<COSName> cosNameIterator = cosNames.iterator();
                while (cosNameIterator.hasNext()) {
                    COSName cosName = cosNameIterator.next();
                    //判断给定名称的XObject资源是否为图像
                    if(resources.isImageXObject(cosName)) {
                        PDImageXObject pdImage = (PDImageXObject) resources.getXObject(cosName);
                        BufferedImage image = pdImage.getImage();
                        try(FileOutputStream fileOutputStream = new FileOutputStream(file.getParentFile().getAbsolutePath()+ File.separator + fileName + ".jpg")) {
                            //输出图片到指定位置
                            ImageIO.write(image, "jpg", fileOutputStream);
                            fileOutputStream.flush();
                        } catch (IOException e) {
                            System.out.println("输出文件失败:" + fileName + e.getMessage());
                        }
                    }
                }
            }
        } catch (IOException e) {
            System.out.println("提取失败:" + fileName);
        } finally {
            try {
                document.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

}

PDFBox的其他操作具体可查看API文档:

感谢你看到了现在,最后别忘了点个赞哦!

相关推荐
S. Dylan8 小时前
Edge浏览器打开PDF无法显示电子签章
edge·pdf
一马平川的大草原8 小时前
如何基于pdf2image实现pdf批量转换为图片
计算机视觉·pdf·文件拆分
m0_594526308 小时前
Python批量合并多个PDF
java·python·pdf
hairenjing11238 小时前
将图片添加到 PDF 的 5 种方法
pdf
✿゚卡笨卡8 小时前
pdf 添加页眉页脚,获取前五页
java·pdf
blegn8 小时前
PDF编辑工具Adobe Acrobat DC 2023安装教程(附安装包)
pdf·办公软件·office
patrickpdx10 小时前
如何调整pdf的页面尺寸
pdf
星月前端13 小时前
【vue-pdf】简单封装pdf预览组件
javascript·vue.js·pdf
Eiceblue17 小时前
Python 在PDF中绘制形状(线条、矩形、椭圆形等)
vscode·python·pycharm·pdf
有过~17 小时前
免费且强大的PDF转换工具——PDFgear
pdf