1

私はJSF2.0(Eclipse IDE)を使用しており、Beanの1つに、ApacheFOP1.0を使用していくつかのPDFファイルを生成するメソッドがあります。JSFページの[makePDF]ボタンをクリックすると、生成されたPDFがページと同じウィンドウで開きます(PDFを表示/保存/印刷した後は[戻る]ボタンを使用する必要があります)。

「makePDF」ボタンを押すと、標準のポップアップダイアログが表示され、ファイルを保存するか、AdobeReaderで開くかを尋ねられるように変更できます。

「makePDF」ボタンをクリックすると、生成されたPDFがAdobeReaderで直接開かれる方法はありますか(JSFページはまだあり、何も確認する必要はありません)??? また(実際には必要ありませんが、知っておくと便利です)、新しいウィンドウで開いたり、プリンターに直接送信したりする方法はありますか?

これが私のコードの主要部分です(私はいくつかの無関係なものを削除しました):

public void makePDF(long contractId, int documentType) {

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

    try {
        fopFactory.setUserConfig(new File(basePath + "/pdf_transform/config/userconfig.xml"));
        fopFactory.setBaseURL(basePath);
        fopFactory.getFontManager().setFontBaseURL(basePath);
    } catch (Exception e) {
        e.printStackTrace();
    } 
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
    foUserAgent.setBaseURL(fopFactory.getBaseURL());

    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
    response.reset();
    response.setHeader("Content-Type", "application/pdf");
    response.setHeader("Content-disposition", "attachment");
    BufferedOutputStream output = null;

    try {
        output = new BufferedOutputStream(response.getOutputStream(), 10240);
        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(contract)); // my method
        Result res = new SAXResult(fop.getDefaultHandler());

        transformer.transform(src, res);

    } catch (Exception e) {
        e.printStackTrace();
    } 

    facesContext.responseComplete();
}`

削除するresponse.setHeader("Content-disposition", "attachment");と同じウィンドウで開きます。それ以外の場合は、保存するか開くかを尋ねられます。

前もって感謝します。

4

3 に答える 3

2

新しいウィンドウでリクエストを開くことは、JSFの直接の懸念事項ではありません。それはHTMLの問題です。

target="_blank"フォームに追加

<h:form target="_blank">

リクエストを新しいタブ/ウィンドウに送信します。

クライアントのプリンタに直接送信するには、アプレットのように中間者としてクライアント側で実行されるコードを導入する必要があります。

于 2010-12-10T01:59:33.393 に答える
2

PDFを直接開きたい場合は、plsを使用します

response.setHeader("Content-Disposition", "inline");
于 2011-03-03T02:31:59.317 に答える
2

私も同様の問題を抱えていましたが、幸運にもそれを解決するためのエレガントな方法を見つけました。誰かがより良い解決策を持っているなら、私に知らせてください。

ユースケース:ユーザーは、PDFの作成に必要なJSF生成フォームにデータを入力します(PDFはサーブレットから生成されます)。検証が失敗した場合、エラーメッセージが表示されますが、すべてがうまくいくと、PDFファイルが新しいウィンドウで開きます。:-)

私の解決策:

  1. template.xhtml(またはfaceletsを定義するサイト)に次のように入力します。

    <ui:define name="head">
            <h:outputScript rendered="#{myBean.pdfDownloadable}">
                window.open('#{myBean.pdfUrl}',"pdfWindow","width=800,height=900,left=50,top=10")
            </h:outputScript>
    </ui:define>
    
  2. JSFフォームのコマンドリンクは、myBeanのアクションメソッドも指します(例:myBean.showPdf())

  3. フォームデータが有効でshowPdf()が呼び出された場合、pdfDownloadableフィールドをtrueに設定すると、同じ結果が再度レンダリングされますが、今回はwindow.open()が含まれます。

それが誰かを助けることを願っています。

于 2012-05-31T07:54:30.727 に答える