一直以来,Java 体系就缺少操作PDF文件的类库,直到PDFBox 的出现。
PDFBox 是一款基于 Java 的优秀的PDF文件处理类库,支持从PDF文件中提取文本、将图片插入PDF文件、将 PDF 文件逐页的生成图片等等。
这里主要讲一下将 PDF 文件逐页生成图片。
1、PDF 文件逐页生成图片(基于 2.x 版本)
PDDocument doc = PDDocument.load(pdfFile);
int pageCount = doc.getNumberOfPages();
PDFRenderer pdfRenderer = new PDFRenderer(doc);
for (int pageIndex=0; pageIndex<pageCount; pageIndex++) {
BufferedImage image = pdfRenderer.renderImageWithDPI(pageIndex, 105, ImageType.RGB);
ImageIOUtil.writeImage(image, imageFilePath, 105);
}
doc.close();
上述代码能将一个 PDF 文件逐页转换为图片。
笔者在自己的 Windows 机器上能正常运行,将一个带有中文填充字符的 PDF 文件逐页转换为了图片。但是将服务部署到 Linux 机器上后,发现中文填充字符变成了方框,也就是出现了乱码。
2、依赖系统字体经仔细研究,PDFbox 将 PDF 文件转换为图片的过程中,需要操作系统上安装了 PDF 文件中使用的字体,不然可能出现乱码。
而 PDF 文件中用到的字体,可以从【文件】==》【属性】==【字体】中查看。
可以在 linux 上使用 fc-list 指令查看已经安装的字体,比对找出缺少的字体,然后逐一安装。
3、PDFbox 会缓存字体信息安装完相应的字体后,发现乱码还在(空的框框),后来从 PDFbox 的日志上得知,PDFbox 在应用启动的时候会将字体信息缓存到内存中。
于是想到重启应用,重启应用后,日志中会看到已探测到新的字体,并逐一加载到内存缓存,重新执行命令,可以看到乱码消失,图片正常了。
作者:LBQY
链接:https://www.jianshu.com/p/22a84090753f
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。