之前写的java解析电子发票,上线后出现了一下线上的问题,无法解析发票,对问题做个规整,仅供参考!
1. Pdfbox介绍
pdfbox是一款Apache的开源工具,可以进行对pdf进行操作,如题,转图片也包含在里面,还有添加、删除、编辑pdf页,提取文字等功能。对于基本语法可参考官网,这里不再讲解基础,只列出一些问题。
官网:https://pdfbox.apache.org/
2. 依赖
我们在转化过程中可能会遇到转换缺失等问题,请加上以下依赖:
(1) ERROR: Cannot read JBIG2 image: jbig2-imageio is not installed
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>jbig2-imageio</artifactId>
<version>3.0.2</version>
</dependency>
(2) jpegerror的异常
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-jpeg</artifactId>
<version>3.4.2</version>
</dependency>
(3) Cannot read JPEG2000 image: Java Advanced Imaging (JAI) Image I/O Tools are not installed
<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>
3. 常见问题
-
(1)为何我的图片转的那么慢?
如果您的目标图片是PNG图片,这种图片不易失真,如果PDF本身体积就大,或者图片色彩鲜艳,用ImageIO.write时,可能会消耗1~2秒(看文件本身),并且CPU会消耗的非常高。 -
(2)如何解决上面的问题呢?
官方提供了两种方法,renderImage和renderImageWithDPI 。前者第二个参数是浮点型,可以放大倍数。后者貌似是按照像素来转化。由于我们公司要求的比较高,前者放大5~7倍,和后者设置DPI为350~400的效果差不过,后者速度更快。 -
(3)生产环境中,为什么和我本地转化出来的图片不同?
生产环境一般用Linux主机,当然Linux主机也有自己的字体,我们一般开发环境用的是Windows自带的字体文件。我们的做法是,直接把Windows下的字体(C:\Windows\Fonts)文件移动到Linux下(可行)。
#cd /usr/share/fonts/ // 进入系统自带的字体目录
#mkdir myfonts // myfonts 是你自己随便取得文件夹名字
#将字体文件拷贝到这个文件夹下,在cd /usr/share/fonts/目录下执行以下命令
#mkfontscale
#mkfontdir
#fc-cache -fv //更新字体缓存
#source /etc/profile // 执行以下命令让字体生效
#fc-list // 查看系统中所有得字体,可用于测试是否安装字体成功
https://www.jianshu.com/p/c85017f8577a