一直以来,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在应用启动的时候会将字体信息缓存到内存中。于是想到重启应用,重启应用后,日志中会看到已探测到新的字体,并逐一加载到内存缓存,重新执行命令,可以看到乱码消失,图片正常了。
网友评论