1

UPDATE2: 完全に機能するようになりました! 下にスクロールして方法を確認してください...
更新: 動作しました! まあ...部分的に。下にスクロールして答えを見つけてください...

FOファイルをPDF(またはRTFに変換する際に外部画像を表示するようにしようとしています。RTFが画像を表示できるかどうかはわかりません (彼らは) ) FOP を使用していますが、うまく動作しないようです。(ここでの質問は私のものとは異なります。)

私は IKVM 0.46.0.1 を使用しており、.NET に入れるために FOP 1.0 dll をコンパイルしました。画像を追加しようとしなかった場合、このコードは正常に機能しました。

private void convertFoByMimetype(java.io.File fo, java.io.File outfile, string mimetype)
{
    OutputStream output = null;

    try
    {
        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
        // configure foUserAgent as desired

        // Setup outputput stream.  Note: Using BufferedOutputStream
        // for performance reasons (helpful with FileOutputStreams).
        output = new FileOutputStream(outfile);
        output = new BufferedOutputStream(output);

        // Construct fop with desired output format
        Fop fop = fopFactory.newFop(mimetype, foUserAgent, output);

        // Setup JAXP using identity transformer
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(); // identity transformer

        // Setup input stream
        Source src = new StreamSource(fo);

        // 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 ex)
    ...
}

ただし、私(またはDocBook2FO変換)が次のコードを追加したとき:

<fo:external-graphic src="url(images/interface.png)" width="auto" height="auto" content-width="auto" content-height="auto" content-type="content-type:image/png"></fo:external-graphic>

FO ファイルに挿入すると、画像が表示されませんでした。Apache のサイトの FAQ を少し読んだところ、次のように書かれていました。

3.3. グラフィックがレンダリングされないのはなぜですか?

最も一般的なのは、外部ファイルが FOP によって検出されないことです。以下を確認してください。

空または間違った baseDir 設定。

ファイル名のスペルミス (大文字と小文字の違いを含む)。

...

他のオプションは私の場合ではないようでした(主に以下の理由-「奇妙な部分」)。私はこれを試しました:

...
try
{
    fopFactory.setBaseURL(fo.getParent());
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
    foUserAgent.setBaseURL(fo.getParent());
    FOURIResolver fourir = fopFactory.getFOURIResolver();
    foUserAgent.setURIResolver(fourir);
    // configure foUserAgent as desired
...

役に立たない。

奇妙な部分

FOP のコマンドライン実装を使用すると、正常に動作し、問題なく画像が表示されます。(ユーザーが私のプログラムを使用したいときに、Java と .NET フレームワークのインストールをユーザーに強制したくないため、プログラムからコマンドラインを実行するルートには行きたくありません。)
png ファイル私のアプリケーション内からGDI +から生成されます(Bitmap.Saveを使用)。さまざまなpngファイルも試しましたが、どれもうまくいきませんでした。
不足している可能性のあるものはありますか?

ここまで来てくれてありがとう

更新と可能な答え

それで、うまくいかなかった理由がわかったかもしれません。コードの学習に時間を費やしました (基本的に、あまり考えずにコピーペーストする前に)。問題実際に間違った basedir 設定にあります。

キーは、このコードのチャンクにあります。

    // Setup JAXP using identity transformer
    TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer(); // identity transformer

    // Setup input stream
    Source src = new StreamSource(fo);

    // 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);

ここで行われるのは恒等変換であり、それ自体の結果を以前に作成した FOP のインスタンスにルーティングします。これにより、ルーティングされた FO の basedir がアプリケーションの実行可能ファイルの basedir に効果的に変更されます。変換せずにこれを行い、入力を FOP に直接ルーティングする方法をまだ理解していませんが、今のところ、イメージを実行可能ファイルのディレクトリにコピーすることでこれを回避しました。

ここで別の問題が発生しました。コードを実行しようとすると、 という行で例外が発生しtransformer.transform(src, res);ます。ExceptionHelper は次のように述べています。

java.lang.ExceptionInInitializerError がキャッチされました

内部例外や例外メッセージはありません。私が書いたものだけではこれをデバッグするのが難しいことはわかっていますが、簡単に修正できることを願っています。

また、このメールは漠然と関連しているようですが、返信がありません。

更新2

最後に、眠れぬ夜を数晩過ごした後、可能な限り最も簡単な方法の 1 つで動作させることができました。

IKVM を更新し、fop を新しいバージョンでコンパイルし、IKVM 参照を新しい dll に置き換えました。エラーは発生しなくなり、画像は正常にレンダリングされます。

これがいつか誰かに役立つことを願っています

4

2 に答える 2

2

私は非常によく似たコードを使用していますが、FOUserAgent、Resolvers などがなくても完全に機能します。

関数srcなしで XSLT に属性を設定しようとしましたか?url()

問題をさらに診断するのに役立つ可能性があるのは、次のステートメントです。

java.lang.System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog")
java.lang.System.setErr(New java.io.PrintStream(New TraceStream(TraceStream.Level.Error)))
java.lang.System.setOut(New java.io.PrintStream(New TraceStream(TraceStream.Level.Info)))

お気に入りのロガーに書き込むTraceStreama の .NET 実装はどこにありますか。パッケージのバージョンをhttp://pastebin.com/XH1Wg7jnjava.io.OutputStreamに投稿しました。Common.Logging

于 2011-09-12T22:11:17.080 に答える
0

質問への回答を残さないための投稿を次に示します。解決策については、元の投稿の「更新 1」と「更新 2」を参照してください。

于 2011-10-05T14:09:52.057 に答える