fop-1.0 から ikvm を使用して fop.dll を生成しました。
ikvmc -target:library -reference:IKVM.OpenJDK.Core.dll -recurse:{myPathToJars}\*.jar -version:1.0 -out:{myPathToJars}\fop.dll
Windows アプリケーションで fop.dll を使用すると、すべてが完璧に機能します。
クラス ライブラリで使用すると、次のエラーが発生します。
javax.xml.transform.TransformerFactory.newInstance() で「プロバイダー com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl が見つかりません」
コード行は次のとおりです。
TransformerFactory ファクトリー = TransformerFactory.newInstance();メソッドのコードは次のとおりです。
public static void xmlToPDF(文字列 xmlPath、文字列 xslPath、SortedList 引数、文字列 destPdfPath) { java.io.File xmlfile = new java.io.File(xmlPath); java.io.File pdffile = new java.io.File(destPdfPath); 試す { // 必要に応じて fopFactory を構成します FopFactory fopFactory = FopFactory.newInstance(); FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); // 必要に応じて foUserAgent を構成します // セットアップ出力 OutputStream outputStream = new java.io.FileOutputStream(pdffile); outputStream = new java.io.BufferedOutputStream(outputStream); 試す { // 目的の出力形式で fop を構築します Fop fop = fopFactory.newFop("application/pdf" /*MimeConstants.MIME_PDF*/, foUserAgent, outputStream); // XSLT のセットアップ TransformerFactory ファクトリー = TransformerFactory.newInstance(); java.io.File xsltfile = new java.io.File(xslPath); トランスフォーマー トランスフォーマー = factory.newTransformer(new StreamSource(xsltfile.getAbsoluteFile())); // スタイルシートに a の値を設定します if (引数 != null) { IList キー = 引数.GetKeyList(); foreach (var key in keys) { オブジェクト値 = 引数[キー]; トランスフォーマー.setParameter(key.ToString(), 値); } } // XSLT 変換の入力を設定 ソース src = 新しい StreamSource(xmlfile); // 結果の SAX イベント (生成された FO) は、FOP にパイプする必要があります 結果 res = new SAXResult(fop.getDefaultHandler()); // XSLT 変換と FOP 処理を開始 トランスフォーム (src, res); } キャッチ (例外 e1) { System.Console.WriteLine(e1.Message); } 最後に { outputStream.close(); } } キャッチ(例外例) { System.Console.WriteLine(ex.Message); } }
ikvm-0.46.0.1 を使用して fop.dll を作成しました (fop 1.0 に基づく)。次のjarを含めました。
avalon-framework-4.2.0.jar バティック-オール-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 アプリケーションとクラス ライブラリで動作が異なるのはなぜですか?
追加 10/19/11:
次の作業を行うことができました:
- MyMainPrg (Windows フォーム アプリケーション)
- MyFopWrapper (fop.dll を呼び出すクラス ライブラリ)
しかし、私の場合、これは解決策ではありません。私のターゲット プロジェクトでは、次の構造になっているからです。
- MainCmdLinePrg (コンソール アプリケーション。DLL_1 を呼び出します)
- DLL_1 (DLLsharedFop を呼び出します) {DLLsharedFop を呼び出すことができる DLL がいくつかあります}
- DLLsharedFop (fop.dll を直接呼び出します。または - 私は気にしません - MyFopWrapper を呼び出す可能性があります)
残念ながら、この構造はエラーになります。
ペア (ACmdLinePrg,MyFopWrapper) に短縮できます: 既にこれは機能しません! しかし (MyMainPrg,MyFopWrapper) は...