JAI:如何从多页 TIFF 图像容器中提取单页输入流?

2023-12-07

我有一个将 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 容器页面输入流?提前致谢。


我可能是错的,但我不认为 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(使用前将#替换为@)

JAI:如何从多页 TIFF 图像容器中提取单页输入流? 的相关文章

  • 有没有办法在 java 桌面应用程序上体验 Windows 8 Metro 的外观和感觉?

    正如标题中所述 我真的很难找到这个问题的好答案 我目前正在开发一个仅桌面应用程序 根本没有 CSS 或任何互联网部分 我希望它看起来像 Windows 8 的 Metro 外观 我不是在谈论布局 而是在谈论外观和感觉 我特别喜欢方形而不是圆
  • Hibernate 4 字节码增强不适用于脏检查优化

    我正在使用 Hibernate 4 3 6 并且我使用了最新的Maven 字节码增强 http vladmihalcea com hibernate 4 bytecode enhancement 使所有实体提高自我肮脏意识 我添加了mave
  • 使用 Eclipse 将具有外部依赖项的 Java 项目导出到 jar

    有没有一种简单的方法可以将 Java 项目 包括其所有外部依赖项 导出到标准 jar 文件 我开发了一个使用多个 Apache 库的 SDK 我希望能够将该项目作为单个 jar 发布 到目前为止我找到的这个问题的答案要求将项目打包为 Run
  • APNS(Apple 推送通知服务器)的反馈服务

    我们正在使用Java作为推送通知提供商APNS I我能够将消息发送到APNS但我不知道如何获得该消息的反馈 请帮忙 反馈服务具有类似于用于发送推送通知的接口的二进制接口 您可以通过以下方式访问生产反馈服务feedback push appl
  • Java:无安全管理器:RMI 类加载器已禁用

    您好 我有 RMI 应用程序 现在我尝试从客户端调用服务器上的一些方法 我有以下代码 public static void main final String args try Setting the security manager Sy
  • 使用 Hibernate Criteria 过滤 Map 中的键和值

    我有以下持久类 public class Code ElementCollection targetClass CodeValue class MapKeyClass CodeProperty class JoinTable name co
  • 外部实体更改后索引不更新

    我目前正在开发一个项目 使用 JPA 2 1 保存数据并使用 hibernate search 4 5 0 final 搜索实体 映射类和索引后 搜索工作正常 但是 当我更改值时描述B 类从 someStr 到 anotherStr 数据库
  • 为本地@ExceptionHandler编写JUnit测试

    我有以下控制器 class Controller ResponseStatus HttpStatus OK RequestMapping value verifyCert method RequestMethod GET public vo
  • 使用 equals 方法比较两个对象,Java

    我有一个对象数组 我想将它们与目标对象进行比较 我想返回与目标对象完全匹配的对象的数量 这是我的计数方法 public int countMatchingGhosts Ghost target int count 0 for int i 0
  • java数学中的组合“N选择R”?

    java库中是否有内置方法可以为任何N R计算 N选择R 公式 实际上很容易计算N choose K甚至不需要计算阶乘 我们知道 公式为 N choose K is N N K K 因此 公式为 N choose K 1 is N N N
  • 按名称获取 ArrayList

    这是正确的获取方式吗ArrayList
  • SDK尚未初始化,请务必先调用FacebookSdk.sdkInitialize()

    我在实现 Facebook SDK 时遇到此错误 并且我tried https stackoverflow com questions 15490399 error inflating class com facebook widget l
  • 应用程序中空指针异常[重复]

    这个问题在这里已经有答案了 我正在尝试在我的应用程序中实施应用程序内计费 我写了这段代码 public class Settings extends PreferenceFragment ServiceConnection mService
  • Java给定长度的随机数

    我需要在 Java 中生成一个恰好 6 位数字的随机数 我知道我可以在随机发生器上循环 6 次 但是在标准 Java SE 中还有其他方法可以做到这一点吗 要生成 6 位数字 Use Random http download oracle
  • 动态创建 JSON 对象

    我正在尝试使用以下格式创建 JSON 对象 tableID 1 price 53 payment cash quantity 3 products ID 1 quantity 1 ID 3 quantity 2 我知道如何使用 JSONOb
  • 使用 Commons 或 Guava 将文本文件转换为 Java Set

    我想将文件中的每一行加载到 HashSet 集合中 有没有一种简单的方法可以做到这一点 怎么样 Sets newHashSet Files readLines file charSet 使用番石榴 参考 文件 readLines http
  • 接口中“不能降低继承方法的可见性”的含义

    我有两个文件 public interface PrintService void print PrintDetails details class PrintDetails private String printTemplate pub
  • 检查 Java 字符串实例是否可能包含垃圾邮件数据的最简单方法

    我有一个迭代 String 实例的过程 每次迭代对 String 实例执行很少的操作 最后 String 实例被持久化 现在 我想为每次迭代添加一个检查 String 实例是否可能是垃圾邮件的检查 我只需验证 String 实例不是 成人材
  • while循环只执行一次

    我很难弄清楚为什么 while 循环实际上不会循环 它运行一次并停止 import java util public class mileskm public static void main String args Scanner inp
  • Swing:创建可拖动组件...?

    我在网上搜索了可拖动 Swing 组件的示例 但我发现示例不完整或不起作用 我需要的是一个摇摆组件那可以是dragged通过鼠标 在另一个组件内 被拖拽的时候 应该已经 改变它的位置 而不仅仅是 跳 到目的地 我很欣赏无需非标准 API 即

随机推荐

  • 如何使用selenium为firefox浏览器禁用通知

    我想在启动 Firefox 浏览器时完全禁用通知 对于不同的浏览器 驱动程序 需要设置不同的配置文件 选项 Firefox FirefoxProfile ffprofile new FirefoxProfile ffprofile setP
  • 与 NEON 内在函数的数据类型兼容性

    我正在使用来自 C 代码的 NEON 内在函数进行 ARM 优化 我理解并掌握了大部分打字问题 但我陷入了这一问题 指令vzip u8返回一个uint8x8x2 t值 实际上是两个数组uint8x8 t 我想将返回值分配给一个普通的uint
  • C# 泛型类中的协方差

    C 4 0 NET 4 5 Silverlight 5 看起来很奇怪 我找不到解决方案 所以需要一些帮助 我有基类 Base 和派生类 Child Base 我还有帮助程序类 它具有通用类型来执行特定工作 一个 EF 实体帮助程序 其中 T
  • 如何从文件路径中删除%20?

    file home ashu Music Collections randomPicks ipod 20on 20sep 2009 Coldplay Sparks mp3 如何转换像上面这样的字符串以获得可以传递到的正常文件路径open 功
  • 如何使用 mechanize 库执行 HEAD 请求?

    我知道如何使用 httplib 执行 HEAD 请求 但我必须对该站点使用 mechanize 本质上 我需要做的是从标头 文件名 中获取值 而不实际下载文件 有什么建议我可以如何实现这一点吗 Mechanize 本身仅发送 GET 和 P
  • 在 OfficeJS 中,您可以检索绑定对象的范围吗?

    针对 Word Online 但任何针对 Excel PPT 的指示也会有所帮助 本质上 是否可以将绑定对象内的文本视为范围 因此 能够选择全部并将插入符移动到开头 结尾 我设想代码具有以下效果 Office select myBindin
  • 如何从 python 中的另一个 .py 文件访问全局变量?

    我创建了两个文件 当我运行时a py 结果是 1 1 这是正确的 然而 运行b py 结果是没有 我如何获取请求的值b py a py requests def set value global requests requests 1 1
  • 创建一个大的虚拟文件

    我是这个社区的新手 也是 iOS 开发的新手 我希望有人能帮助我解决一些小问题 目前我正在为自己编写一个小应用程序 它应该创建一个非常大的虚拟文件 其中包含虚拟数据或单词或任何使它变大的东西 原因是 我想单击一个按钮 应用程序应该生成一个
  • 使用另一个 data.table 中的值更新 data.table 中的值

    我有一个包含大约 2500 万行的数据集 我正在获取这些行的子集并执行一个运行良好的函数 但是 我接下来需要做的是用新值更新原始数据集中的值 同时保留其余值 我确信这很简单 但我就是无法理解它 这是我正在处理的事情的简化版本 require
  • 无需 AJAX 将 JSON 文件从 jQuery 发送到 PHP

    所以 我是 javascript jquery 的新手 但我已经使用 PHP 足够长的时间了 我知道如何使用 PHP 从输入中获取数据 这非常简单 但是当尝试使用 jQuery 执行相同操作时 如何操作却超出了我的想象 现在我有这个脚本 还
  • JavaScript 中的 PMT

    我正在尝试编写与 EXCEL PMT 函数等效的代码 在 JavaScript 中 公式如下所示 function PMT ir np pv fv ir interest rate per month np number of period
  • nextTriggerDate() 不返回“预期”值,是否有其他方法来获取重复本地通知的下一个触发日期?

    在我的应用程序中 我允许用户安排重复的本地通知 我遇到的问题 基于环顾四周的任何其他问题 是 nextTriggerDate 始终将其返回值基于当前时间而不是安排通知的时间 我看到了在通知的 userInfo 中存储 日期 值的建议 但从通
  • ASP.NET Core 2.0 MVC - 如何从视图编译中排除某些文件夹?

    这是场景 我使用这段代码https iamrufio com 2017 09 08 rendering emails with razorviewengine in net core 2 0 感谢作者 将视图呈现为字符串 用于电子邮件 但是
  • 为什么 Borland 会在不同的 C 文件中使用同一对象的多个定义进行编译,而 GCC 却不会?

    我正在研究全局变量的行为 到目前为止 我认为全局变量的多重定义是一种非法的方式 并且必须得到一个错误 但是我从 Borland C C 编译器得到了意想不到的结果 而 GCC 给了我预期的结果 Code test1 c include
  • 为什么 FirebaseAuth.getInstance().getCurrentUser() 在 android 中返回 null 值

    我正在关注使用firebase发送图像的代码 我已经配置了 firebase 存储 url 数据库 url 数据库规则 true sha1 将 google services json 放置在应用程序文件夹中 但是当我调试代码时 it 用户
  • Apache Airflow 仅向列表中的第一个人发送 SLA 未命中电子邮件

    我使用 Apache Airflow 我希望它能够在 SLA 未命中时发送电子邮件通知 我将电子邮件地址存储为气流变量 并且我有一个 dag 其任务之一使用 EmailOperator 发送电子邮件 问题来了 因为当我向所有收件人运行发送邮
  • 如何在 geo URI Intent 启动的地图中显示标记?

    我有一个应用程序 我想通过启动具有特定地理坐标的 Google 地图来显示不同的位置 一次一个 由用户输入选择 我目前正在使用这个 当然具有真实的纬度和经度值 Intent intent new Intent Intent ACTION V
  • 如何为每个列名添加后缀(或前缀)?

    我想添加 x每个列名称的后缀 如下所示 featuresA myPandasDataFrame columns values x 我该怎么做呢 另外 如果我想添加x 作为后缀 解决方案会如何变化 以下是我认为添加后缀的最好方法 df df
  • 与菜单元素中的右“左三角形”对齐

    我构建 HTML CSS JS 菜单 并希望将箭头向右对齐以指出该元素是子菜单 我的问题是 在 Firefox 中 三角形 符号 显示在下一行而不是当前行 铬在两种情况下都表现良好 BTS中存在与我的情况类似的错误 https bugzil
  • JAI:如何从多页 TIFF 图像容器中提取单页输入流?

    我有一个将 PDF 文档转换为图像的组件 每页一张图像 由于该组件使用转换器生成内存中图像 因此它会对 JVM 堆造成严重影响 并且需要一些时间才能完成转换 我正在尝试提高转换过程的整体性能 并找到了一个具有 JNI 绑定的本机库来将 PD