Java PDFToImage

2019-06-24  本文已影响0人  半亩房顶

背景 & 需求

业务需要,emmm,好吧挺坑的,项目运营人员不管从哪里下载的PDF,都想统一上传展示,有的很大,有的很长,嗯,没错,不管什么来源,你全给我统一咯(我不管,反正我不懂技术,你给我实现),首先,先来一巴掌(内心里,内心里)

思路 & 调研

备选解决方案

主要问题就在于PDF转图片过程中的压缩了,其他的都是可以工具解决,例子也很多

用到的组件

icepdf
jai-imageio-core
jai-imageio-jpeg2000
batik系列组件

其中 batik系列组件是对于svg有很好的支持,生成缩放等等功能都可以支持

icepdf
jai-imageio-core
jai-imageio-jpeg2000

开发中遇到的问题(坑)

首先是SVG方案的不可行

SVG方案看似很美好,但是,其实SVG是基于XML的描述性文件(详情请戳)(其他图像是像素文件),所以本质上,SVG是文本文件,并不是一个常规的图像,也就无法完成体积的压缩,所谓的压缩只是去除了头部的metadata的;而且我们需要的是多个图片拼接成一个图片,拼接之后再去转也就没有意义了,因为转完之后的图片足够清晰也就可以了,并没有很大程度的放大需求

当然其实SVG的优点也很明显。它单图体积并不大,我们实例中用到的大概1M左右,无论放大缩小都不会失真,这一点很是优秀的

然后是两个组件的坑

jai_core
jai-imageio-jpeg2000

jai_core是icepdf的依赖,但其资源难以获取,maven处理过程中会有报错,解决方案有二,其一是我实际开发中其实没有用到,直接不要了

<exclusions>
    <exclusion>
        <groupId>javax.media</groupId>
        <artifactId>jai_core</artifactId>
    </exclusion>
</exclusions>

其二是网络上找到资源,弄到项目里

转有些PDF时候,会出现转换错误,报错其实很明显,没有jpeg2000的支持,下载如上组件就好

再者是icepdf的坑

生成新图片时候有一句代码

BufferedImage imageResult = new BufferedImage(maxWidth, height, BufferedImage.TYPE_INT_RGB);

看似不经意,但是这个宽高可是像素,当图片分辨率足够高时,这个新生成的数组会有200多M,直接弄爆内存了,所以也就是上述方案中需要根据分辨率动态调整下缩放级别
另,注意主动释放内存,处理的图片很大了,这个问题需要关注了

最后是一个留白问题

PDF中的每一页可能并不都大小相同,所以需要做统一处理,较小的图片做一次留白操作,保证每一个图片宽高都一致,否则拼接时候有可能空指针报错,要小心

收获与不足

收获

不足

欢迎大佬们指点
以上,共勉


欢迎大家关注我的公众号


半亩房顶
上一篇 下一篇

猜你喜欢

热点阅读