1

UPDATE2:我现在可以完全正常工作了!向下滚动以了解如何...
更新:我得到了它的工作!嗯……部分。向下滚动寻找答案...

我正在尝试让我的 FO 文件在将其转换为 PDF(或 RTF)时显示外部图像,但我不确定 RTF 是否甚至能够显示图像 (他们是))与 FOP,但我似乎无法让它工作。(这里提出的问题我的不同。)

我正在使用 IKVM 0.46.0.1 并编译了一个 FOP 1.0 dll 以放入 .NET;当我没有尝试添加图像时,此代码运行良好:

private void convertFoByMimetype(java.io.File fo, java.io.File outfile, string mimetype)
{
    OutputStream output = null;

    try
    {
        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
        // configure foUserAgent as desired

        // Setup outputput stream.  Note: Using BufferedOutputStream
        // for performance reasons (helpful with FileOutputStreams).
        output = new FileOutputStream(outfile);
        output = new BufferedOutputStream(output);

        // Construct fop with desired output format
        Fop fop = fopFactory.newFop(mimetype, foUserAgent, output);

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

        // Setup input stream
        Source src = new StreamSource(fo);

        // Resulting SAX events (the generated FO) must be piped through to FOP
        Result res = new SAXResult(fop.getDefaultHandler());

        // Start XSLT transformation and FOP processing
        transformer.transform(src, res);
    }
    catch (Exception ex)
    ...
}

但是,当我(或者更确切地说是 DocBook2FO 转换)添加以下代码时:

<fo:external-graphic src="url(images/interface.png)" width="auto" height="auto" content-width="auto" content-height="auto" content-type="content-type:image/png"></fo:external-graphic>

进入FO文件,图像没有显示。我阅读了Apache 网站上的一些常见问题解答,上面写着:

3.3. 为什么我的图形没有渲染?

最常见的是,FOP 找不到外部文件。检查以下内容:

空的或错误的 baseDir 设置。

文件名中的拼写错误(包括使用错误的大小写)。

...

其他选项似乎不是我的情况(主要是因为以下原因 - “奇怪的部分”)。我试过这个:

...
try
{
    fopFactory.setBaseURL(fo.getParent());
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
    foUserAgent.setBaseURL(fo.getParent());
    FOURIResolver fourir = fopFactory.getFOURIResolver();
    foUserAgent.setURIResolver(fourir);
    // configure foUserAgent as desired
...

无济于事。

奇怪的部分

当我使用 FOP 的命令行实现时,它可以正常工作并毫无问题地显示我的图像。(我不想走 run-command-line-from-program 路线,因为我不想强迫用户在他们想要使用我的程序时安装 Java 和 .NET 框架。)
png 文件是从我的应用程序中的 GDI+ 生成的(使用 Bitmap.Save)。我也尝试了不同的 png 文件,但它们都不适合我。
有什么我可能会丢失的吗?

非常感谢你能走到这一步

更新和可能的答案

所以我可能已经弄清楚为什么它不起作用了。我花了一些时间研究代码(在我基本上只是复制粘贴它而不考虑它之前)。问题确实出在错误的 basedir 设置中。

关键就在这段代码中:

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

    // Setup input stream
    Source src = new StreamSource(fo);

    // Resulting SAX events (the generated FO) must be piped through to FOP
    Result res = new SAXResult(fop.getDefaultHandler());

    // Start XSLT transformation and FOP processing
    transformer.transform(src, res);

这里发生的是身份转换,它将自己的结果路由到我之前创建的 FOP 实例中。这有效地将路由 FO 的 basedir 更改为应用程序可执行文件的 basedir。我还没有弄清楚如何在不进行转换并将我的输入直接路由到 FOP 的情况下做到这一点,但目前我通过将图像复制到可执行文件的目录中来解决这个问题。

这就是另一个问题出现的地方。现在,每当我尝试执行代码时,我都会在“ ”行出现异常,transformer.transform(src, res);这让我感到困惑,因为它什么也没说。ExceptionHelper 说:

java.lang.ExceptionInInitializerError 被捕获

并且没有内部异常或异常消息。我知道仅从我写的内容很难调试,但我希望可能有一个简单的修复。

此外,这封电子邮件似乎与此相关,但没有任何答复。

更新2

最后,在几个不眠之夜之后,我设法用最简单的方法之一让它工作。

我更新了 IKVM,用新版本编译了 fop,并用新的 dll 替换了 IKVM 引用。该错误不再发生,我的图像渲染良好。

我希望有一天这对某人有所帮助

4

2 回答 2

2

我使用的是非常相似的代码,虽然没有 FOUserAgent、Resolvers 等,但它运行良好。

您是否尝试src在没有该功能的情况下在 XSLT 中设置属性url()

以下陈述可能有助于您进一步诊断问题:

java.lang.System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog")
java.lang.System.setErr(New java.io.PrintStream(New TraceStream(TraceStream.Level.Error)))
java.lang.System.setOut(New java.io.PrintStream(New TraceStream(TraceStream.Level.Info)))

写入您最喜欢的记录器TraceStream的 .NET 实现在哪里。我在http://pastebin.com/XH1Wg7jnjava.io.OutputStream上发布了该Common.Logging软件包的版本。

于 2011-09-12T22:11:17.080 回答
0

这是一篇不要让问题未得到解答的帖子,请参阅原始帖子中的“更新 1”和“更新 2”以获取解决方案。

于 2011-10-05T14:09:52.057 回答