我有一个将 PDF 文档转换为图像的组件,每页一张图像。由于该组件使用转换器生成内存中图像,因此它会对 JVM 堆造成严重影响,并且需要一些时间才能完成转换。
我正在尝试提高转换过程的整体性能,并找到了一个具有 JNI 绑定的本机库来将 PDF 转换为 TIFF。该库只能将 PDF 转换为单个 TIFF 文件(需要中间文件系统存储;甚至不消耗转换流),因此结果 TIFF 文件已嵌入转换的页面,而不是文件系统上的每页图像。拥有本机库可以极大地改善整体转换,并且性能变得更快,但存在真正的瓶颈:由于我必须进行源页面到目标页面的转换,现在我必须从结果文件中提取每个页面并写入他们都在别处。一种简单而天真的方法RenderedImage
s:
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 容器页面输入流?提前致谢。
我可能是错的,但我不认为 JAI 支持在不将文件解码为内存图像的情况下分割 TIFF。而且,很抱歉推广我自己的库,但我认为它正是您所需要的(用于分割 TIFF 的解决方案的主要部分是由第三方贡献的)。
通过使用TIFFUtilities班级来自com.twelvemonkeys.contrib.tiff
,您应该能够将多页 TIFF 拆分为多个单页 TIFF,如下所示:
TIFFUtilities.split(tempFile, new File("output"));
不进行图像解码,仅将每个 IFD 拆分为单独的文件,并使用更正的偏移量和字节计数写入流。
文件将被命名output/0001.tif
, output/0002.tif
如果您需要对输出名称进行更多控制或者有其他要求,您可以轻松修改代码。该代码带有 BSD 风格的许可证。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)