Я создал 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 Application и Class Library?
Добавление 10/19/11:
Мне удалось заставить работать следующее:
Но для моего случая это не решение, потому что в моем целевом проекте у меня следующая структура:
К сожалению, эта конструкция приводит к ошибке.
Можно сократить до пары (ACmdLinePrg,MyFopWrapper): уже это не работает! Но (MyMainPrg,MyFopWrapper) работает...
Я использовал пакеты NuGet [1 111] FOP.dll v1.1.0 и IKVM pacakges v7.1.45 в приложении C#.NET. Я получил эту проблему о сервере Windows 2016 x64 с сообщениями об ошибках как:
------------------------------Fop.cs (111): Поставщик com.sun.org.apache.xalan.internal.xsltc.trax. TransformerFactoryImpl, не найденный - в javax.xml.transform. TransformerFactory.newInstance () Fop.cs (125): Поставщик com.sun.org.apache.xerces.internal.jaxp. SAXParserFactoryImpl, не найденный - в javax.xml.parsers. SAXParserFactory.newInstance () \r\n в org.apache.avalon.framework.configuration. DefaultConfigurationBuilder.. ctor (булевская переменная enableNamespaces) \r\n в
org.apache.avalon.framework.configuration. DefaultConfigurationBuilder.. ctor () \r\n
, в котором я разрешил проблему путем добавления тех двух строк, начинает процедуры
com.sun.org.apache.xerces.@internal.jaxp.SAXParserFactoryImpl s = new com.sun.org.apache.xerces.@internal.jaxp.SAXParserFactoryImpl();
com.sun.org.apache.xalan.@internal.xsltc.trax.TransformerFactoryImpl t = new com.sun.org.apache.xalan.@internal.xsltc.trax.TransformerFactoryImpl();
полезную ссылку: