gpt4 book ai didi

java - Java Applet 中的 Apache FOP - 未找到数据的 ImagePreloader

转载 作者:行者123 更新时间:2023-12-02 11:17:35 25 4
gpt4 key购买 nike

我正在研究成熟商业产品中的问题。

简而言之,我们使用 Apache POI 库的一部分来读取 Word .DOC 或 .DOCX 文件,并将其转换为 XSL-FO,以便我们可以进行标记替换。然后,我们使用嵌入到 Java 程序中的 FOP 将 FO 数据转换为 PDF 以便打印。问题是,所有这些都是在客户端上在 Internet Explorer 中运行的 Java 小程序中完成的。

最初我们使用的是 FOP 0.93,它运行得相当不错。然而,它在生成 PDF 时无法利用 DOC 文件中的字体,并且会将所有内容映射到 Times,这是一位客户不喜欢的。理论上,可以通过添加某种字体指标数据来使其工作,但这需要对可能遇到的每种字体进行相对复杂的定义,并且我们无法预测客户端在 MS 之外可能使用的内容核心字体集。

为了解决此问题,FOP 升级到 1.0,添加了对从操作系统自动检测字体的支持。这有效,但我们注意到图像处理已停止工作并且信头已消失。似乎发生的情况是,FOP 内的图像加载器在 0.93 到 0.95 之间的某个时刻被重写,因此现在使用 ImageIO,而不是使用 Jimi 和 JAI。早期的实现工作正常,但新代码不喜欢作为小程序运行。

图像嵌入在 FO 数据的 URI 中,因此我们会收到如下错误:2014-09-30 17:00:10,607 错误 [org.apache.fop.apps.FOUserAgent] 图像不可用。网址:数据:图像/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAABSCAIAAABysmn6AAA......gggg==。原因:org.apache.xmlgraphics.image.loader.ImageException:不支持该文件格式。找不到数据的 ImagePreloader:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAABSCAIAAABysmn6AAAA...

当通过测试工具运行时,会生成正确的输出,但是当在浏览器中作为小程序运行时,我们会收到上述错误,这让我怀疑浏览器小程序安全性以某种方式干扰了 ImageIO 插件加载程序。

FOP 转换的核心,即触发错误的位是这样的:

// Step 4: Setup JAXP using identity transformer
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(); // identity transformer

transformer.transform(src, res);

...这一切都在 PrivilegedAction block 内运行,因为在 FOP 1.0 中它需要文件 I/O 访问来管理字体缓存。

在Linux下运行独立的FOP 0.93和1.0程序并使用strace表明它正在为图像数据写出临时文件,但0.93和1.0都做了类似的事情,所以它本身不应该是这样的,特别是因为它应该已经有创建临时文件的权限。

由于几年前的某些版本显然存在 ImageIO 库的安全问题,因此我尝试了不同版本的 JRE,但无济于事。

有什么想法吗?

谢谢

最佳答案

如果其他人也有类似的情况,结果证明这是由 Maven 构建项目的方式引起的。

Fop 1.0及以上版本使用xml-graphics-commons库来方便图像渲染。正如问题中提到的,这使用了一个插件注册表,该注册表是使用 JAR 中的以下文件进行配置的:

META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImageConverter
META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImageLoaderFactory
META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImagePreloader

...其中每个都包含将支持的图像解码器的列表。

问题是 xml-graphics-common 为这些文件提供了一组合理的默认值,而 FOP 也有一组相互冲突的默认值,由于某种奇怪的原因禁用了所有图像解码器,并且其中一个优先.

为了解决这个问题,我确保我的 maven pom.xml 文件在 FOP 之前导入了 xml-graphics-common,以便其默认值优先,此时一切都变得生动起来。

我仍然不确定为什么代码作为独立测试程序可以正常工作,但我怀疑这是处理类路径的方式与在插件模式下运行的方式不同。

关于java - Java Applet 中的 Apache FOP - 未找到数据的 ImagePreloader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26139301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com