C# .NET中的FOP和IKVM-映像不工作

C# .NET中的FOP和IKVM-映像不工作,c#,.net,pdf,apache-fop,ikvm,C#,.net,Pdf,Apache Fop,Ikvm,更新2:我现在完全可以用了!向下滚动查看如何… 更新:我让它工作了!好。。。部分地。向下滚动找到答案… 我试图让我的FO文件在转换成PDF(或者RTF,但我不确定RTF是否能够用FOP显示图像(它们是))时显示外部图像,但我似乎无法让它工作。(问的问题和我的不同。) 我正在使用IKVM0.46.0.1,并编译了一个FOP1.0DLL以放入.NET;当我没有尝试添加图像时,此代码运行良好: private void convertFoByMimetype(java.io.File fo, java

更新2:我现在完全可以用了!向下滚动查看如何…
更新:我让它工作了!好。。。部分地。向下滚动找到答案…

我试图让我的FO文件在转换成PDF(或者RTF,但我不确定RTF是否能够用FOP显示图像(它们是))时显示外部图像,但我似乎无法让它工作。(问的问题和我的不同。)

我正在使用IKVM0.46.0.1,并编译了一个FOP1.0DLL以放入.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>
无济于事

奇怪的部分 当我使用FOP的命令行实现时,它工作得很好,可以毫无问题地显示我的图像。(我不想从程序路径转到运行命令行,因为我不想强迫用户在使用我的程序时安装Java和.NET framework。)
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.ExceptionInInitializeError

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

此外,电子邮件似乎有点模糊的联系,但没有答案

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

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


我希望有一天这能帮助别人

我正在使用非常类似的代码,尽管没有FourAgent、解析器等,而且工作非常完美

您是否尝试在XSLT中设置
src
属性而不使用
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
java.io.OutputStream
的.NET实现,它写入您最喜欢的记录器。
我发布了一个版本的
通用。登录
软件包。

这里有一个帖子,不要让问题悬而未决,请参阅原始帖子中的“更新1”和“更新2”了解解决方案。

非常感谢您的回复。在DocBook2FO转换之后,我尝试进入调试模式并动态编辑文件,删除url()“包装器”,将其反馈给fop。没有什么变化。我甚至尝试编辑图像的完整路径(
文件://
以及所有包含的内容),但都没有成功。也谢谢你的其他建议,我会仔细研究一下。你是否尝试过输入包含示例图像文件(羽毛徽标)而不是自定义图像?我有一个类似的问题,实现无法读取我的图像格式…只是尝试了一下。没有显示图像。我使用了
xml\u feather.gif
文件,该文件位于
examples\fo\graphics
中。
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)))