これは私の最初の質問です。正しくやっているといいのですが。事前に私の悪い英語で申し訳ありません:)
私は 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();
}