FOP/ikvm: ошибка "Provider com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl not found"

Я создал 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:
Мне удалось заставить работать следующее:

  • MyMainPrg (Windows Forms Application)
  • MyFopWrapper (Class Library, которая вызывает fop. dll)

Но для моего случая это не решение, потому что в моем целевом проекте у меня следующая структура:

  • MainCmdLinePrg (консольное приложение; вызывает DLL_1)
  • DLL_1 (вызывает DLLsharedFop) {есть несколько DLL, которые могут вызывать DLLsharedFop}
  • DLLsharedFop (вызывает непосредственно fop. dll; или - мне все равно - может вызывать MyFopWrapper)

К сожалению, эта конструкция приводит к ошибке.
Можно сократить до пары (ACmdLinePrg,MyFopWrapper): уже это не работает! Но (MyMainPrg,MyFopWrapper) работает...

6
задан jahuer1 19 October 2011 в 10:55
поделиться

1 ответ

Я использовал пакеты 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();

полезную ссылку:

https://github.com/KevM/tikaondotnet/issues/21

0
ответ дан 17 December 2019 в 04:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: