当前位置: 首页 > 知识库问答 >
问题:

Apache FOP:将资源打包到jar中后找不到图像

丁鸿云
2023-03-14

我的 Apache FOP 应用程序有问题。

一切正常,直到我开始将外部文件(xsl、ttf、…)从外部工作目录打包到应用程序的jar文件中。从那以后,不再加载图像,我收到以下错误:

FOUserAgent - Image not available. URI: data:image/jpeg;base64,.... 
Reason: org.apache.xmlgraphics.image.loader.ImageException: The file format is 
not supported. No ImagePreloader found for data:image/jpeg;base64,...(No context info available)
org.apache.xmlgraphics.image.loader.ImageException: The file format is not supported. No ImagePreloader found for data:image/jpeg;base64

在 xsl 文件中,图像嵌入了:

<fo:external-graphic xsl:use-attribute-sets="helpicon" 
  fox:alt-text="helpicon" 
  src="url('data:image/jpg;base64,...I'm the base64 encoded image data...')">   
</fo:external-graphic>

当我将文件打包到jar中时,为什么图像不再工作?图像作为base64字符串嵌入到xsl文件中,因此图像数据必须可用...

谢谢:)

编辑1我正在用以下内容设置FopFactory基本url:

    String path = MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath();
    String decodedPath = URLDecoder.decode(path, "UTF-8");
    File jar = new File(decodedPath);

    fopFactory.setBaseURL(jar.getParent());

这是我的ClasspathUriResolver:

public class ClasspathUriResolver implements URIResolver {

@Override
public Source resolve(String fileName, String base) throws TransformerException {

    System.out.print(" RESOLVING: " + fileName);

    URL url = getClass().getClassLoader().getResource(fileName);
    StreamSource jarFileSS = new StreamSource();

    System.out.println(" TO: " + url.toString());

    try {
        InputStream jarfileIS = url.openStream();
        jarFileSS.setInputStream(jarfileIS);
    } catch (IOException ioExp) {
        throw new TransformerException(ioExp);
    }
    return jarFileSS;
}

我检查了ClasspathUriResolver的日志,包含的文件(字体、样式表)得到了正确的解析。

共有1个答案

葛成双
2023-03-14

我已经将jdk版本更新到1.7.71,现在一切正常。谢谢:)

 类似资料:
  • 我正在做一个项目,编译并运行我的IDE工作正常。所有资源都找到了,它正常工作。然而,当我构建我的. jar时,它能够找到一些资源,但不是全部。我的项目结构看起来是这样的: 当我运行jar文件时,它能够找到图像并使用它们,但是当我尝试访问html文件时,它不会打开。下面是jar的项目结构; 我以前从未处理过jar文件,所以这似乎是我犯的一个非常明显的错误。感谢您的帮助,谢谢! 编辑:访问找不到的文件

  • 请教Webpack打包后找不到资源? 入口文件如下: 打包在lib目录,如下: 入口文件index_bundle.js在package.json中设置main指向./lib/index_bundle.js就好了 但是874.index_bundle.js这个文件就找不到了,提示如下 于是我去查了下,说是要设置homepage 但是无论我是设置./lib/还是设置.,都不对 于是我想是不是要将hom

  • 问题内容: 我有一些可怕的行为。我有以下Maven配置: 这将创建包含所有类的JAR文件,但我在类路径中有一些资源也应包括在内。如果我将参数放在阶段的前面,那么我的所有资源都会包括在内。如果我使用运行Maven ,则不包含任何资源。我的资源位于(不是通常的目录)下。 问题答案: 目标配置中未正确定义资源的源目录。同样,outputDirectory元素将资源放置在dir中,默认情况下将其打包。试试

  • 我有一些可怕的比目鱼。我有以下Maven配置: 这创建了包含所有类的JAR fie,但我在类路径中有一些资源也应该包括在内。如果我将参数留在phase前面,那么我的所有资源都包括在内了。如果我使用运行maven,则不包含任何资源。我的资源在(不是通常的目录)下。

  • 我使用SpringBootMaven插件将应用程序打包为jar文件。 它可以在Itellij IDE中找到直接运行的资源文件,但之后找不到资源文件,显示错误为: JAVA木卫一。FileNotFoundException:类路径资源[jmxremote.password]无法解析为绝对文件路径,因为它不位于文件系统:jar:file:/home/XXX/target/yyyy中。罐子/BOOT-I

  • 这个问题非常相似(如果不是相同的话): “找不到基本名称消息的捆绑包”错误 为MessageSource找不到ResourceBundle[消息]:无法为基名消息找到bundle 基本上,我有以下代码: 当我试着跑的时候 我试图更改文件名,在代码中更改文件名,添加资源文件夹(但我认为它已经被正确地包括在内),并放置消息。属性文件位于所有可能的文件夹中。奇怪的是,eclipse本身显示了这个错误,它