11

これは私の最初の質問です。正しくやっているといいのですが。事前に私の悪い英語で申し訳ありません:)

私は JSF 2.0 (Eclipse IDE) を使用しており、Apache FOP 1.0 を使用していくつかの PDF ファイルを生成しようとしています。

Apache Fop サイトの手順を使用して簡単な PDF ファイルを作成できましたが、アプリケーション フォルダーから画像を挿入できません。私のフォルダー構造は次のようなものです: 私のアプリケーション WebContent には、(特に) pdf_transform/xslt/transformFile.xsl と pdf_transform/xslt/logo.jpg があります。

transformFile.xsl には

<fo:block><fo:external-graphic src="url('logo.jpg')"/></fo:block>

しかし、サーブレットで「showPDF」ボタンをクリックすると、画像のないPDFファイルが表示され(他はすべてそこにあります)、コンソールに次のメッセージが表示されます:

SEVERE: URI 解決から返されたソースには、URI の InputStream が含まれていませんでした: logo.jpg 2010 年 11 月 18 日 5:16:49 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE: 画像が見つかりません。URI: ロゴ.jpg. (コンテキスト情報はありません)

url('logo.jpg') の代わりに 'logo.jpg' を使用して、WebContent フォルダー内のさまざまな場所に画像を配置し、別のナビゲーション ("./logo.jpg") を使用しようとしましたが、うまくいきませんでした。

絶対パス (「d:/fop/images/logo.jpg」など) を設定すると問題なく動作しますが、アプリケーションのリソースが必要です。

検索中に、これが fopFactory.setURIResolver() および/または userAgent.setBaseURL() に関連していることがわかりました。それを使って何かを試みましたが、成功しませんでした。

私は JSF と FOP の両方に不慣れで、このイメージの状況にかなり長い間悩まされてきました。誰かがこれを手伝ってくれますか、少なくとも「相対パスを使用するようにFOPを構成する方法」に関するチュートリアルに案内してくれますか?

編集:絶対パスは必要ありません。アプリはコンピューター上の場所とは無関係に動作する必要があります(公開可能にするため)。私の検索では、FOPの構成に関係があることがわかりましたが、その方法がわかりません:)

前もって感謝します。

PSこれは、PDFを表示するために呼び出されるメソッドです。

public void printExchangeRateList(ActionEvent event) {

    BufferedOutputStream output = null;

    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();  

    String path = externalContext.getRealPath("/");


    try {

        response.reset();
        response.setHeader("Content-Type", "application/pdf");
        output = new BufferedOutputStream(response.getOutputStream(), 10240);

        File xsltfile = new File(path+"/pdf_transform/xslt/transformFile.xsl");

        FopFactory fopFactory = FopFactory.newInstance();
        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

        try {
            Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output);

            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer(new StreamSource(xsltfile));

            Source src = new DOMSource(makeXML()); // my method
            Result res = new SAXResult(fop.getDefaultHandler());

            transformer.transform(src, res);


        } finally {
            if (output != null) output.close();
            /*try {
                out.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }*/
        }

    } catch (Exception e) {
        // TODO Auto-generated catch block
    }

    facesContext.responseComplete();
}
4

3 に答える 3

14

私は自分の問題の解決策を見つけました。やってみたと思ったのですが、当時はちょっと間違えたようです。とにかく、次のコードで

FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
String basePath = externalContext.getRealPath("/");

FopFactory fopFactory = FopFactory.newInstance();
fopFactory.setBaseURL(basePath);
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
foUserAgent.setBaseURL(fopFactory.getBaseURL());

Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output); // for some output

アプリケーションのWebContentフォルダーから始まる相対パスを使用して、xsltファイルから画像(およびその他のリソース)にアクセスできます。私の場合、このようにlogo.jpgにアクセスできます

<fo:external-graphic src="url('pdf_transform/xslt/logo.jpg')"/>

これを理解するのに時間がかかりました、なぜネット上にそのような基本的なものの例がないのかわかりません(または私はそれらを見つけることができません:)

注: FOP 2.0には、setBaseURL()方法はありません。代わりに、ベースURLをパラメータとしてに渡しますFopFactory.newInstance()。他のセッターの多くはFopFactoryBuilderに移動されました。

于 2010-11-21T23:27:20.617 に答える
2

写真の Web URL にアクセスできる場合は、レポートを生成するときにそれも使用できます (例: http://localhost/images/logo.jpg ) 。

しかし、まだ Web サーバー上にローカルに画像がありましたが、アプリケーションへのパスを XML ファイルに含めて、次のように使用しました。

<xsl:variable name="base_path" select="base-path"/>
<xsl:variable name="logo" select="companies/company/logo"/>
<fo:external-graphic src="url({$base_path}{logo})"/>

XML 構造は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<base-path>/path/to/app/</base-path>
<companies>
  <company>
    <logo>images/company1.jpg</logo>
  </company>
  <company>
    <logo>images/company2.jpg</logo>
  </company>
</companies>
于 2010-11-18T18:35:11.940 に答える