FOP和IKVM在.net -图像不工作
本文关键字:图像 工作 net IKVM FOP | 更新日期: 2023-09-27 18:07:36
UPDATE2:我现在完全工作了!
更新:我让它工作!嗯…部分。
我试图让我的FO文件在将其转换为PDF(或RTF为此,
我使用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网站上的一些FAQ,上面说:
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
...
with no avail
奇怪的部分
当我使用FOP的命令行实现时,它工作得很好,没有问题地显示我的图像。(我不想走从程序运行命令行路线,因为我不想强迫用户在使用我的程序时安装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说:
. lang。ExceptionInInitializerError被捕获
并且没有内部异常或异常消息。我知道这很难从我写的调试,但我希望可能有一个简单的修复。
还有,这封邮件似乎有点相关,但没有回复。
更新2
最后,经过几个不眠之夜,我设法用最简单的方法之一使它工作。
我更新了IKVM,用新版本编译了top,并用新的dll替换了IKVM引用。错误不再发生,我的图像呈现良好。
我希望这对某个人有帮助
我使用非常相似的代码,虽然没有FOUserAgent, Resolvers等,它工作得很好。
您是否尝试在没有url()
函数的XSLT中设置src
属性?
可以帮助您进一步诊断问题的语句如下:
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实现,它写入您最喜欢的记录器。我在http://pastebin.com/XH1Wg7jn上发布了Common.Logging
包的一个版本。
这篇文章是为了解决这个问题而写的,请参阅原文中的"更新1"answers"更新2"。