有没有人成功地将Apache FOP v1.0库编译成.NET DLL?我正在使用http://onjava.com/pub/a/onjava/2004/08/18/ikvm.html处的IKVM语法;但是,编译的DLL似乎不完整。例如,我无法将FopFactory对象实例化为:
using org.apache.fop.apps;
namespace Utils
{
public class PdfRender
{
public void Render()
{
FOUserAgent foUserAgent = fop.getUserAgent();
FopFactory fopFactory = FopFactory.newInstance();
}
}
}
答案 0 :(得分:8)
(由FOP用户组的人员提供)
先决条件:已安装IKVM 0.44.0.5。
C:\Fop\Build\
ikvmc -target:library -reference:IKVM.OpenJDK.Core.dll -recurse:C:\Fop\Build\\*.jar -version:1.0 -out:C:\Fop\fop.dll
fop.dll
,IKVM.OpenJDK.*.dll
和IKVM.Runtime.dll
答案 1 :(得分:6)
我尝试了ClayB建议的方法,没有任何成功。
我使用了IKVM 0.44和0.46与FOP 0.95和1.0的组合。但没有任何效果!有一些java库缺失并导致错误。还发生了.net异常:无法在System.Security命名空间中加载类型。我甚至试图按照http://onjava.com/pub/a/onjava/2004/08/18/ikvm.html的Avik Sengupta的建议将每个.jar文件编译成一个dll,但是卡在lib \ batik-all-1.7.jar上。除非有人有任何进一步的工作,否则我相信这种方法不再适用于最新的工具包。
然而,我找到了一种不同的方法,允许人们从.net调用FOP。我希望这会对某人有所帮助:
try {
ProcessStartInfo p = new ProcessStartInfo(fopPath + "fop.bat");
p.Arguments = String.Format("{0} {1}", foFilePath, pdfFilePath);
p.WindowStyle = ProcessWindowStyle.Hidden;
p.WorkingDirectory = fopPath;
Process proc = new System.Diagnostics.Process();
proc.StartInfo = p;
proc.Start();
proc.WaitForExit();
}
catch() {
}
请阅读原文:http://www.ptperalta.net/index.php/technology/using-apache-fop-in-net.html
答案 2 :(得分:3)
我知道这是一个老线程,但仍需要进行一些研究才能实现这一目标。它现在可以在Visual Studio 2013中与NuGet一起使用.NuGet包称为crispin.fop。在下面的代码中,我传入了一个“fop”文件和我想要创建的新PDF文件,并且“voila”,它被创建。
using org.apache.fop.tools;
using org.apache.fop.apps;
using org.xml.sax;
using java.io;
public void GeneratePDF(string foFile, string pdfFile)
{
OutputStream os = new BufferedOutputStream(new FileOutputStream(new java.io.File(pdfFile)));
try
{
FopFactory fopFactory = FopFactory.newInstance();
Fop fop = fopFactory.newFop("application/pdf", os);
FOUserAgent foUserAgent = fop.getUserAgent();
javax.xml.transform.TransformerFactory factory = javax.xml.transform.TransformerFactory.newInstance();
javax.xml.transform.Transformer transformer = factory.newTransformer();
javax.xml.transform.Source src = new javax.xml.transform.stream.StreamSource(new java.io.File(foFile));
javax.xml.transform.Result res = new javax.xml.transform.sax.SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
}
catch (Exception ex)
{
throw ex;
}
finally
{
os.close();
}
}
答案 3 :(得分:0)
ClayB为我工作。请记住第2点“将所有JAR文件复制到C:\ Fop \ Build \”
“所有”非常重要。在这里看到我需要的罐子清单:
- fop.jar
- avalon-framework-4.2.0.jar
- batik-all-1.7.jar
- commons-io-1.3.1.jar
- commons-logging-1.0.4.jar
- serializer-2.7.0.jar
- xalan-2.7.0.jar
- xercesImpl-2.7.1.jar
- xml-apis-1.3.04.jar
- xml-apis-ext-1.3.04.jar
- xmlgraphics-commons-1.4.jar
除了fop之外的所有jar都可以在文件夹“lib”中找到。
答案 4 :(得分:0)
ClatB也在这里工作。只需记住将所有IKVM库添加到项目中(使用Fop 1.1和IKVM 7.2.4630.5)。