浅析pdfbox将pdf文件转图片报错Cannot read JPEG2000 image的问题及JPEG与JPEG2000介绍了解

一、问题背景

1、问题报错:How to fix "Cannot read JPEG2000 image: Java Advanced Imaging (JAI) Image I/O Tools are not installed"

  我正在建立一个java项目,使用pdfBox从PDF中获取图像。因为我在使用 tika-app 实现其他功能,所以我决定使用 tika-app-1.20.jar 中的pdfBox。

  我曾经尝试过包含 jai-imageio-core-1.3.1.jar,因为Tika-app 已经与这个jar捆绑在一起。我试过单独使用 tika-app jar。

  抛出错误的这条代码:

PDXObject object=resources.getXObject(cosName);

  错误的日志跟踪:

org.apache.pdfbox.filter.MissingImageReaderException: Cannot read JPEG2000 image: 
Java Advanced Imaging (JAI) Image I/O Tools are not installed at org.apache.pdfbox.filter.Filter.findImageReader(Filter.java:163) at org.apache.pdfbox.filter.JPXFilter.readJPX(JPXFilter.java:115) at org.apache.pdfbox.filter.JPXFilter.decode(JPXFilter.java:64) at org.apache.pdfbox.cos.COSInputStream.create(COSInputStream.java:77) at org.apache.pdfbox.cos.COSStream.createInputStream(COSStream.java:175) at org.apache.pdfbox.cos.COSStream.createInputStream(COSStream.java:163) at org.apache.pdfbox.pdmodel.common.PDStream.createInputStream(PDStream.java:236) at org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject.<init>(PDImageXObject.java:140) at org.apache.pdfbox.pdmodel.graphics.PDXObject.createXObject(PDXObject.java:70) at org.apache.pdfbox.pdmodel.PDResources.getXObject(PDResources.java:426)

  但我很确定我在tika有jai imageio内核,当我运行代码时,它是不可见的。

  解决方案:

1、It happens that it requires an additional jar known as jai-imageio-jpeg2000 to support jp2k images. 说的是:它需要一个额外的jai-imageio-jpeg2000 jar来支持jp2k图像。

2、事实上,我也偶然发现了这个错误,但这里的PDFBox文档中提到了这一点。您需要将以下依赖项添加到pom.xml中:

<dependency>
    <groupId>com.github.jai-imageio</groupId>
    <artifactId>jai-imageio-core</artifactId>
    <version>1.4.0</version>
</dependency>

<dependency>
    <groupId>com.github.jai-imageio</groupId>
    <artifactId>jai-imageio-jpeg2000</artifactId>
    <version>1.3.0</version>
</dependency>

<!-- Optional for you ; just to avoid the same error with JBIG2 images -->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>jbig2-imageio</artifactId>
    <version>3.0.3</version>
</dependency>

  为了避免JBIG2图像出现同样的错误,可以加上后面那个依赖。

  如果您正在使用Gradle,则这样加上依赖:

dependencies {
    implementation 'com.github.jai-imageio:jai-imageio-core:1.4.0'
    implementation 'com.github.jai-imageio:jai-imageio-jpeg2000:1.3.0'

    // Optional for you ; just to avoid the same error with JBIG2 images
    implementation 'org.apache.pdfbox:jbig2-imageio:3.0.3'
}

二、项目实例场景

1、问题场景:

  在项目中文档转换 - PDF转图片功能出现了一个BUG(使用pdfbox2.0.2),原PDF文件里面很多图片元素,在转换成图片以后就消失不见了。这还了得,赶紧查日志,发现产生大量报错:

ERROR o.a.p.contentstream.PDFStreamEngine 890 - Cannot read JPEG2000 image: Java Advanced Imaging (JAI) Image I/O Tools are not installed

  这说的意思就是缺少啥 I/O 工具,不能读取 JPEG2000 格式的图片,问题应该就出在这里了。

2、问题原因:pdf 文件中可能包含的扫描件是JPEG2000格式的图片,这样pdfbox在转换的过程中需要JAI的支持。

3、解决方案:加上相关依赖

国外*:https://*.com/questions/42169154/pdfbox1-8-12-convert-pdf-to-white-page-image,最后一条不起眼的小回复给了启发,加上了依赖

4、对比:

  添加依赖前 - 图片丢失

浅析pdfbox将pdf文件转图片报错Cannot read JPEG2000 image的问题及JPEG与JPEG2000介绍了解

  添加依赖后 - 图片展示

浅析pdfbox将pdf文件转图片报错Cannot read JPEG2000 image的问题及JPEG与JPEG2000介绍了解

三、JPEG 与 JPEG2000 介绍了解

1、背景介绍:

  JPEG 全名为 Joint Photographic Experts Group,它是一个在国际标准组织(ISO)下从事静态图像压缩标准制定的委员会。它制定出了第一套国标静态图像压缩标准:ISO 10918-1 就是我们俗称的 JPEG 了。由于JPEG优良的品质,使得它在短短的几年内就获得极大的成功,目前网站上百分之八十的图像都是采用JPEG的压缩标准。

  然而,随著多媒体应用领域的激增,传统JPEG压缩技术已无法满足人们对多媒体图像资料的要求。因此,更高压缩率以及更多新功能的新一代静态图像压缩技术 JPEG 2000 就诞生了。JPEG 2000 正式名称为 “ISO 15444” ,同样是由JPEG 组织负责制定。

2、基本概念

  JPEG 2000是基于小波变换的图像压缩标准,由Joint Photographic Experts Group组织创建和维护。JPEG 2000通常被认为是未来取代JPEG(基于离散余弦变换)的下一代图像压缩标准。JPEG 2000文件的副档名通常为.jp2,MIME类型是image/jp2

  JPEG2000的压缩比更高,而且不会产生原先的基于离散馀弦变换的JPEG标准产生的块状模糊瑕疵。

  JPEG2000同时支持有损压缩和无损压缩。

  另外,JPEG2000也支持更复杂的渐进式显示和下载。

  由于JPEG2000在无损压缩下仍然能有比较好的压缩率,所以JPEG2000在图像品质要求比较高的医学图像的分析和处理中已经有了一定程度的广泛应用。

3、JPEG2000 原理

  JPEG 2000 与传统 JPEG 最大的不同,在于它放弃了 JPEG 所采用的以离散馀弦转换为主的区块编码方式,而改采以小波转换为主的多解析编码方式。

  小波转换的主要目的是要将图像的频率成分抽取出来。简单原理图可以参考下图。

浅析pdfbox将pdf文件转图片报错Cannot read JPEG2000 image的问题及JPEG与JPEG2000介绍了解

4、JPEG2000 优点

(1)JPEG2000 作为JPEG升级版,高压缩(低码率)是其目标,其压缩率比 JPEG 高约 30% 左右。
(2)JPEG2000 同时支持有损和无损压缩,而 JPEG 只能支持有损压缩。因此它适合保存重要图片。
(3)JPEG2000 能实现渐进传输,这是JPEG2000的一个极其重要的特征。这也就是我们对 GIF 格式图像常说的“渐现”特性。它先传输图像的轮廓,然后逐步传输数据,不断提高图像质量,让图象由朦胧到清晰显示,而不必是像现在的 JPEG 一样,由上到下慢慢显示。
(4)JPEG2000 支持所谓的“感兴趣区域”特性,你可以任意指定图像上你感兴趣区域的压缩质量,还可以选择指定的部份先解压缩。这样我们就可以很方便的突出重点了。

5、JPEG2000版权专利问题

  JPEG2000 存在版权和专利的风险。这也许是目前JPEG2000技术没有得到广泛应用的原因之一

  JPEG2000标准本身是没有授权费用,但是,因为编码的核心部分的各种演算法被大量注册专利,所以一般认为,不太可能避开这些专利费用开发出免授权费的商用编码器。

上一篇:python对图片进行base64编码,互相转换


下一篇:ECharts图表导入Excel(一)