最近项目开发过程涉及到了pdf文件的内容的解析和和内容的提取入库操作,其中pdf的解析采用了开源的apache pdfbox 插件,版本选用的是最新版本的2.0.8版本,现将简单的读取解析的步骤记录如下:

1、导入jar,基础的需要 pdfbox-2.0.8.jar ,fontbox-2.0.8.jar 2个jar包

Apache下载链接如下:

https://pdfbox.apache.org/download.cgi

mvean可以如下添加:

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

</dependency>

<dependency>
                            <groupId>org.apache.pdfbox</groupId>
                            <artifactId>fontbox</artifactId>
                            <version>2.0.8</version>

</dependency>

2、从PDF中获取文本内容:

首先 读取文件,或者获取web上传的文件流,然后生成pdfdocument,最后document进行遍历解析,封装自己想要的数据或者对象,具体的解析代码如下:

/**
     * 从pdf文件中解析为字符串,只能返回pdf中的文字内容,图片,表格均解析不了
     * @param pdfFile
     * @param sort 是否有序
     * @return
     * @throws Exception
     */
    public static String getTextFromPdf(InputStream fileStream, boolean sort) {
        // 开始提取页数
        int startPage = 1;
        // 结束提取页数
        String content = null;
        PDDocument document = null;
        try {
            // 加载 pdf 文档
            document = PDDocument.load(fileStream);
            int endPage = null == document ? Integer.MAX_VALUE : document.getNumberOfPages();
            PDFTextStripper stripper = new PDFTextStripper();
            stripper.setSortByPosition(sort);
            stripper.setStartPage(startPage);
            stripper.setEndPage(endPage);
            content = stripper.getText(document);
            log.info("pdf 文件解析,内容为:" + content);
        } catch (Exception e) {
            log.error("文件解析异常,信息为: " + e.getMessage());
        }
        return content;

}

3、从pdf文档中抓取图片的列表信息(话不多说,直接贴代码)

/**
     * 从pdf文档中读取所有的图片信息
     *
     * @return
     * @throws Exception
     */
    public static List<PDImageXObject> getImageListFromPDF(PDDocument document,Integer startPage) throws Exception {
        List<PDImageXObject> imageList = new ArrayList<PDImageXObject>();
        if(null != document){
            PDPageTree pages = document.getPages();
            startPage = startPage == null ? 0 : startPage;
            int len = pages.getCount();
            if(startPage < len){
                for(int i=startPage;i<len;i++){
                    PDPage page = pages.get(i);
                    Iterable<COSName> objectNames = page.getResources().getXObjectNames();
                    for(COSName imageObjectName : objectNames){
                        if(page.getResources().isImageXObject(imageObjectName)){
                            imageList.add((PDImageXObject) page.getResources().getXObject(imageObjectName));
                        }
                    }
                }
            }
        }
        return imageList;
    }

注意:上个方法中返回的list中为 PDImageXObject 对象,不是我们Java中对应的Image对象,所以不能直接保存到本地或者提交到服务器,需要进行简单的转换一下,例子可参考如下:

/**
     * 读取图片文件流信息
     * @param iamge
     * @return
     * @throws Exception
     */
    public static InputStream getImageInputStream(PDImageXObject iamge) throws Exception
    {
        if(null!=iamge && null!= iamge.getImage())
        {
            BufferedImage bufferImage = iamge.getImage();  
            ByteArrayOutputStream os = new ByteArrayOutputStream();  
            ImageIO.write(bufferImage, iamge.getSuffix(), os);  
            return new ByteArrayInputStream(os.toByteArray());
        }
        return null;
    }

这样就可以读取到对应的图片的例子,可以new File对象写到磁盘上,如:

File imgFile = new File("e:\\"+name+"."+image.getSuffix());
                    FileOutputStream fout = new FileOutputStream(imgFile);
                    ByteArrayOutputStream os = new ByteArrayOutputStream();  
                    ImageIO.write(imageb, image.getSuffix(), os);  
                    InputStream is = new ByteArrayInputStream(os.toByteArray());  
                    int byteCount = 0;
                    byte[] bytes = new byte[1024];

while ((byteCount = is.read(bytes)) > 0)
                    {                       
                        fout.write(bytes,0,byteCount);       
                    }

fout.close();

is.close();

以上仅供参考,经测试可以解析到文本和图片并且可以保存入库和view层展示下载等,代码只是实现了原理,没有进行进一步的优化,希望大家指正,谢谢

Apache PdfBox 2.0.X 版本解析PDF文档(文字和图片)相关推荐

  1. Apache PDFBox 将嵌入文件添加到 PDF 文档

    本教程演示如何将嵌入文件添加到 PDF 文档. Maven 依赖项 我们使用 Apache Maven 来管理我们的项目依赖项.确保以下依赖项驻留在类路径中. <dependency>&l ...

  2. 用Python提取解析pdf文档中内容

    用Python提取解析pdf文档中内容 文章目录: 参考: 1.https://blog.csdn.net/tmaczt/article/details/82876018 # Tika库 2.http ...

  3. java imageio删除图片_Java 提取、替换、删除PDF文档中的图片

    在一篇文章里,配有与文本信息相得益彰的图片,不仅能够活跃与美化版面,同时也有利于提高文章的可读性和阅读效果,从而增强其吸引力.同时,对文档中已存在图片的处理也尤为重要.本文将通过使用Java程序来演示 ...

  4. 快速无损原样提取PDF文档中的图片

    网上已经有很多提取PDF文档图片的工具了,但是这些工具要么就是非常庞大,要么就是速度很慢,要么就是导出的图片失真,我对这些工具均不满意,因此为PDF补丁丁开发了快速.无损地提取PDF文档图片的功能. ...

  5. 【方法】PDF文档可以转图片吗?如何操作?

    需要把PDF文档转换成图片,你会怎么做呢? 有些小伙伴可能会直接截图保存,确实是一个快捷的方法,但这种方法容易造成图片质量的损失,也可能遇到无法截图整个页面的情况,或者文档页面多,截图耗费很多时间. ...

  6. 如何将PDF文档中的图片提取出来?

    如何将PDF文档中的图片提取出来? PDF是我们经常接触的一种文档,但对于它的一些编辑操作却并不熟悉,比如有时需要将文档中的图片提取出来,应该如何处理呢? 一.普通文档 常见的PDF文档一般由Word ...

  7. 【Java】基于Pdfbox解析PDF文档中指定位置的文字和图片

    1.1 PDFBOX介绍 Apache PDFBox是一个开源Java库,支持PDF文档的开发和转换. 我们可以使用PDFBox开发可以创建,转换和操作PDF文档的Java程序.PDFBox的主要功能 ...

  8. java解析pdf文档(前面写了docx的解析所以也思考写一份pdf的解析)--PdfReader底层分析

    一.直接将前篇docx文档转成pdf文档用于测试 二.由于使用pdf文档所以需要引入一个新的依赖 <!--itextpdf是生成PDF文档的一个java类库--> <dependen ...

  9. ABBYYFineReader15免费电脑pdf文档文字识别软件

    ABBYYFineReader是一款OCR文字识别软件,它可以对图片.文档等进行扫描识别,并将其转换为可编辑的格式,比如Word.Excel等,操作也是挺方便的. 我们在官网找到该软件并进行下载,打开 ...

最新文章

  1. 解决ubuntu上ifconfig没有eth0/ens33且无法上网的问题
  2. 在命令行窗口查看Maven版本时,出现 Error: JAVA_HOME is set to an invalid directory.的解决方法
  3. python菜鸟excel教程-Python菜鸟之路: 封装通用excel操作
  4. Win32 ListView控件基本使用
  5. CompletableFuture API用法介绍(二)
  6. c 调用java post方法_C#调用Java方法(详细实例)
  7. 【Tiny4412】设置Uboot提示符和关闭MMU
  8. Android笔记——在布局文件中插入另一个布局文件
  9. ubuntu安装LDAP
  10. Nginx设置Laravel项目中图片防盗链以及禁止地址栏直接访问图片
  11. SpringCloud学习笔记006---使用properties配置文件实现多环境配置
  12. Moodle插件开发大全
  13. 揭秘 OceanBase 勇夺 TPC 榜首的王者攻略!
  14. selenium 简介 及浏览器配置
  15. Serial Interface之I2C:关于DS1624 2线通信SDA保持时间的说明
  16. 跟我一起写Makefile:隐含规则
  17. 2019年最新整理:1000多套完整微信小程序源码不同行业源码集合
  18. MySQL said: Authentication plugin ‘caching_sha2_password‘ cannot be loaded... 阿星小栈
  19. 大业达公司裁员风云2
  20. java条形码识别_java openCV 识别条形码

热门文章

  1. Notion 的插件介绍和使用
  2. 【一览表】macOS代号\macOS版本\苹果电脑各型号对应的macOS版本列表
  3. 快递100企业版接口(API)gitee
  4. ACM图灵奖现状以及得主及其分别分别的贡献
  5. 如何查看手机上chrome浏览器的console日志打印
  6. 【工具笔记】Microsoft数学求解器Math Solver
  7. 每天学一个 Linux 命令:dnf
  8. 菜鸟教程JVM优化,看一篇就够了!
  9. Google广告投放技巧,开始Google广告投放
  10. wps如何用循环函数_WPS版Excel中怎样使用函数进行运算