Я создал fop.dll из fop-1.0 с ikvm:
ikvmc -target:library -reference:IKVM.OpenJDK.Core.dll -recurse:{myPathToJars}\*.jar -version:1.0 -out:{myPathToJars}\fop.dll
Если я использую мой fop.dll в приложении Windows, все работает отлично.
Если я использую его в библиотеке классов, я получаю следующую ошибку:
"Provider com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl not found" at javax.xml.transform.TransformerFactory.newInstance()
Строка кода:
TransformerFactory factory = TransformerFactory.newInstance();
Вот код метода:
public static void xmlToPDF(String xmlPath, String xslPath, SortedList arguments, String destPdfPath)
{
java.io.File xmlfile = new java.io.File(xmlPath);
java.io.File pdffile = new java.io.File(destPdfPath);
try
{
// configure fopFactory as desired
FopFactory fopFactory = FopFactory.newInstance();
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// configure foUserAgent as desired
// Setup output
OutputStream outputStream = new java.io.FileOutputStream(pdffile);
outputStream = new java.io.BufferedOutputStream(outputStream);
try
{
// Construct fop with desired output format
Fop fop = fopFactory.newFop("application/pdf" /*MimeConstants.MIME_PDF*/, foUserAgent, outputStream);
// Setup XSLT
TransformerFactory factory = TransformerFactory.newInstance();
java.io.File xsltfile = new java.io.File(xslPath);
Transformer transformer = factory.newTransformer(new StreamSource(xsltfile.getAbsoluteFile()));
// Set the value of a in the stylesheet
if (arguments != null)
{
IList keys = arguments.GetKeyList();
foreach (var key in keys)
{
Object value = arguments[key];
transformer.setParameter(key.ToString(), value);
}
}
// Setup input for XSLT transformation
Source src = new StreamSource(xmlfile);
// 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 e1)
{
System.Console.WriteLine(e1.Message);
}
finally
{
outputStream.close();
}
}
catch (Exception ex)
{
System.Console.WriteLine(ex.Message);
}
}
Я использовал ikvm-0.46.0.1 для создания fop.dll (на основе fop 1.0). Я включил следующие банки:
avalon-framework-4.2.0.jar
batik-all-1.7.jar
commons-io-1.3.1.jar
commons-logging-1.0.4.jar
fop.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
Есть идеи, почему возникает эта ошибка? Почему поведение приложения Windows и библиотеки классов отличается?
Дополнение от 19.10.11:
Мне удалось заставить работать следующее:
- MyMainPrg (приложение Windows Forms)
- MyFopWrapper (библиотека классов, которая вызывает fop.dll)
Но для моего случая это не решение, потому что в моем целевом проекте у меня есть следующая структура:
- MainCmdLinePrg (консольное приложение; вызывает DLL_1)
- DLL_1 (вызывает DLLsharedFop) {есть несколько библиотек DLL, которые могут вызывать DLLsharedFop}
- DLLsharedFop (вызывает напрямую fop.dll; или - мне все равно - может вызвать MyFopWrapper)
К сожалению, эта конструкция приводит к ошибке.
Вы можете сократить до пары (ACmdLinePrg, MyFopWrapper): уже это не работает! Но (MyMainPrg, MyFopWrapper) делает ...