【发布时间】:2017-06-15 11:06:10
【问题描述】:
我有一个将 PDF 文档转换为图片的组件,每页一张图片。由于该组件使用生成内存中图像的转换器,因此它会严重影响 JVM 堆并需要一些时间来完成转换。
我正在尝试提高转换过程的整体性能,并找到了一个带有 JNI 绑定的本机库,可以将 PDF 转换为 TIFF。该库只能将 PDF 转换为单个 TIFF 文件(需要中间文件系统存储;甚至不消耗转换流),因此结果 TIFF 文件具有嵌入的转换页面,而不是文件系统上的每页图像。拥有一个原生库极大地改善了整体转换并且性能变得非常快,但是有一个真正的瓶颈:因为我必须进行源页面到目标页面的转换,现在我必须从结果文件中提取每个页面并编写他们都在别处。 RenderedImages 的简单天真方法:
final SeekableStream seekableStream = new FileSeekableStream(tempFile);
final ImageDecoder imageDecoder = createImageDecoder("tiff", seekableStream, null);
...
// V--- heap is wasted here
final RenderedImage renderedImage = imageDecoder.decodeAsRenderedImage(pageNumber);
// ... do the rest stuff ...
实际上,我真的很想从 TIFF 容器文件 (tempFile) 中提取一个具体的页面输入流,然后将其重定向到其他地方,而无需将其存储为内存中的图像。我会想象一种类似于容器处理的方法,我需要寻找一个特定的条目来从中提取数据(例如,ZIP 文件处理等)。但是我在ImageDecoder 中找不到类似的东西,或者我的期望可能有误,只是在这里遗漏了一些重要的东西......
是否可以使用 JAI API 或第三方替代方案提取 TIFF 容器页面输入流?提前致谢。
【问题讨论】: