我们可以使用 PDFBox 从 PDF 中提取图像。

在本教程中,我们将学习使用 PDFBox 从 pdf 中提取图像并将图像保存到本地。

使用 PDFBox 从 PDF 中提取图像的步骤

以下是使用 PDFBox 从 pdf 中提取图像的分步过程。

1.扩展PDFStreamEngine

创建一个 Java 类并使用 PDFStreamEngine 对其进行扩展。

public class GetImageLocationsAndSize extends PDFStreamEngine

2.调用processPage()

对于 PDF 文档中的每一页,调用方法 processPage(page)。

for( PDPage page : document.getPages() ) {
    pageNum++;
    printer.processPage(page);
}

3.重写processOperator()

对于 PDF 页面中的每个对象,processOperator 在 processPage() 中调用。我们将覆盖 processOperator()。

@Override
protected void processOperator( Operator operator, List operands) throws IOException{
    . . .
}

4.检查图像

检查已发送到 processOperator() 的对象是否是图像对象。

if( xobject instanceof PDImageXObject){
    . . .
}

5. 保存图片到本地

如果对象是图像对象,则获取 BufferedImage 并将其保存到本地。使用 PDImageXObject.getImage() 我们得到一个 ARGB 类型的 BufferedImage。

BufferedImage bImage = image.getImage();
ImageIO.write(bImage,"PNG",new File("image_name.png"));

示例 1 – 使用 PDFBox 从 PDF 中提取图像

在此示例中,我们将获取一个 PDF,并使用 PDFBox processOperator() 方法从该 PDF 中提取所有图像。

SaveImagesInPdf.java

import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.contentstream.operator.Operator;
import org.apache.pdfbox.contentstream.PDFStreamEngine;
 
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
 
import javax.imageio.ImageIO;
 
/**
 * This is an example on how to extract images from pdf.
 */
public class SaveImagesInPdf extends PDFStreamEngine
{
    /**
     * Default constructor.
     *
     * @throws IOException If there is an error loading text stripper properties.
     */
    public SaveImagesInPdf() throws IOException
    {
    }
 
    public int imageNumber = 1;
 
    /**
     * @param args The command line arguments.
     *
     * @throws IOException If there is an error parsing the document.
     */
    public static void main( String[] args ) throws IOException
    {
        PDDocument document = null;
        String fileName = "apache.pdf";
        try
        {
            document = PDDocument.load( new File(fileName) );
            SaveImagesInPdf printer = new SaveImagesInPdf();
            int pageNum = 0;
            for( PDPage page : document.getPages() )
            {
                pageNum++;
                System.out.println( "Processing page: " + pageNum );
                printer.processPage(page);
            }
        }
        finally
        {
            if( document != null )
            {
                document.close();
            }
        }
    }
 
    /**
     * @param operator The operation to perform.
     * @param operands The list of arguments.
     *
     * @throws IOException If there is an error processing the operation.
     */
    @Override
    protected void processOperator( Operator operator, List<COSBase> operands) throws IOException
    {
        String operation = operator.getName();
        if( "Do".equals(operation) )
        {
            COSName objectName = (COSName) operands.get( 0 );
            PDXObject xobject = getResources().getXObject( objectName );
            if( xobject instanceof PDImageXObject)
            {
                PDImageXObject image = (PDImageXObject)xobject;
 
                // same image to local
                BufferedImage bImage = image.getImage();
                ImageIO.write(bImage,"PNG",new File("image_"+imageNumber+".png"));
                System.out.println("Image saved.");
                imageNumber++;
 
            }
            else if(xobject instanceof PDFormXObject)
            {
                PDFormXObject form = (PDFormXObject)xobject;
                showForm(form);
            }
        }
        else
        {
            super.processOperator( operator, operands);
        }
    }
 
}

输出

Processing page: 1
Image saved.
Image saved.
Image saved.
Processing page: 2
Image saved.
Image saved.
Processing page: 3
Processing page: 4

如果您想使用相同的 PDF 文件,请在此处下载apache.pdf pdf 文档。否则,您可以fileName在 Java 程序中指定 PDF 文件路径。

结论

在这个Apache PDFBox 教程中,我们学习了使用 PDFBox 从 pdf 中提取图像,并使用 PDFStreamEngine 类将 ARGB 类型的 BufferedImage 保存到本地。

Java使用 PDFBox 从 pdf 中提取图像相关推荐

  1. php截取部分pdf,用PHP从pdf中提取图像

    我正试图用PHP从PDF中提取图像. 我已成功部分成功 – 我有一个灰度图像-- --我知道我必须在它上面应用一个配方才能获得颜色! 但首先,我需要将图像的二进制数据转换为数字,然后应用the Ado ...

  2. python pdf转图片 poppler_如何使用Python中的poppler库从pdf中提取图像?

    我有一个pdf,我想用 Python提取一些图像.我可以使用poppler-utils库 like this中的pdfimages从Linux命令行轻松提取图像: pdfimages my_file. ...

  3. python 读取pdf图片_使用Python从pdf中提取图像

    下面是一些使用pyPdf读取PDF文件.提取图像并将它们生成为PIL.Image的代码.你需要根据自己的需要修改它,这里只是演示如何遍历对象树.在import io import pyPdf impo ...

  4. Word处理控件Aspose.Words功能演示:从 Java 中的 Word 文档中提取图像

    图像通常用于表示 Word 文档中的重要信息.在文本旁边包含图像使内容更具吸引力.在某些情况下,您可能需要以编程方式提取嵌入在 Word 文档中的图像.为此,本文介绍了如何使用 Java 从 Word ...

  5. pdfparser java_如何使用java从PDF中提取内容?

    在Java编程中,如何使用java从PDF中提取内容? 项目的目录结构如下 - Tika的工具包可从以下网址下载:http://tika.apache.org/download.html ,只下载:t ...

  6. java pdfbox读取pdf中的表格

    java pdfbox读取pdf中的表格 目前遇到了需要解析pdf中表格的需求,遇到无法解析表格中的空格,求助大神帮助!!! <dependency><groupId>org. ...

  7. linux中将文本中的单词换掉的指令_为什么说从PDF中提取文本是一件困难的事?...

    PDF文档处理工作中,总是绕不开对文本提取的需求.很多用户觉得我们PDFlux好用,所以对其中的底层技术也非常感兴趣.也有人为认为,从PDF里抽取文本段落和表格,应该非常简单! 近期,我们会对PDF文 ...

  8. Camelot:从pdf中提取表格数据

    Camelot:从pdf中提取表格数据 文章目录: 一.Camelot的介绍和安装 1. Camelot介绍 2. Camelot的安装 3. 其他 二.Camelot的使用 1. 快速入门使用 2. ...

  9. python处理pdf提取指定数据_python从PDF中提取数据的示例

    01 前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都 ...

  10. python从字符串中提取数字并转换为相应数据类型_python从PDF中提取数据的示例

    01 前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都 ...

最新文章

  1. 投影转换_即插即用,办公投影不用愁:毕亚兹Mini DP转HDMIVGA转换器
  2. PAT (Basic Level) 1035 插入与归并(模拟)
  3. java先进先出 循环队列,JavaScript队列、优先队列与循环队列
  4. Amazon Glacier的Scala客户端
  5. python简单实践作业答案_python入门实践四:爬取牛客网面试专项练习题及答案
  6. fiddler修改支付金额_不容忽视的记账工具:支付宝记账
  7. 转载sanmusoft 论电脑报论坛的挂掉及电脑报的最后倒掉
  8. SolidWorks2016 从入门到入坟 下载安装+画图
  9. 游戏出海成为全球化趋势
  10. JAVA 中文乱码 idea设置
  11. 每日一记—获取Bing每日一图实现Android欢迎页(一)
  12. python 处理pdf文件 转成txt 批量提取pdf中的文字
  13. 移动端vue+vant+高德地图实现拖拽选址,周边选址,搜索选址,自动定位,选择城市功能,获取地址经纬度,详细地址
  14. 什么是生命周期?Activity生命周期的三种状态
  15. 附彩蛋|Spring Security 竟然故意延长登录时间?知道真相的我惊呆了!
  16. P2657 [SCOI2009]windy数(数位dp)
  17. 数据结构——冒泡排序
  18. 使用 Spring Quartz组件实现定时任务
  19. 冯山C语言第六章作业答案,C语言四川师范大学信息与计算科学冯山实验九课案.docx...
  20. 磁盘结构,原理,MBR,文件系统,分区,swap,加密,raid,配额

热门文章

  1. 京东联盟新版API接口PHP版SDK的坑
  2. Electron.js指南——键盘快捷键
  3. 谷歌浏览器如何在不登录的情况下保存书签
  4. IntelliJ IDEA 2020 提示“Unmapped Spring configuration files found.Please configure Spring facet.”解决办法
  5. 1.7 爬取汽车之家实战
  6. 利用Freessl部署免费SSL证书
  7. 一篇博客带你入门shiro
  8. 如何让自己每天按时睡觉
  9. lbochs模拟器最新版_bochs模拟器官方下载
  10. 【码上实战】【立体匹配系列】经典SGM:(3)代价聚合