質問

編集: 私の作業コードを以下の回答に記載してください。


要約: Java Beanのメソッドを呼び出すJSPファイルがあります。このメソッドはPDFファイルを作成し、理論的にはJSPに返して、ユーザーがダウンロードできるようにします。ただし、PDFをロードすると、Adobe Readerで次のエラーが表示されます。ファイルは「%PDF-」で始まっていません

詳細:これまでのところ、JSPはメソッドを正常に呼び出し、PDFが作成され、JSPが表示されて完成したPDFファイルがユーザーに提供されます。ただし、Adobe ReaderがPDFファイルを開こうとすると、エラーが発生します。ファイルは「%PDF-」で始まっていません。念のため、デスクトップでPDFを作成するメソッドを使用して、確認できるようにしました。 Windows内で正常に開くと、問題なく表示されます。では、なぜJSPからの出力が異なるのですか?

PDFを作成するには、 Apache FOP を使用しています。結果のPDFを単純にローカルマシンに保存するのではなく、JSPに渡すことを除いて、最も基本的な例の1つを追っています。 基本的な使用パターンこのサンプルコード

ここに私のJSPファイルがあります:

<%@ taglib uri="utilTLD" prefix="util" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
<%@ page language="java" session="false" %>
<%@ page contentType="application/pdf" %>

<%-- Construct and initialise the PrintReportsBean --%>
<jsp:useBean id="printReportsBean" scope="request" class="some.package.printreports.PrintReportsBean" />
<jsp:setProperty name="printReportsBean" property="*"/>

<c:set scope="page" var="xml" value="${printReportsBean.download}"/>

ここに私のJava Beanメソッドがあります:

//earlier in the class...
private static FopFactory fopFactory = FopFactory.newInstance();

public File getDownload() throws UtilException {

    OutputStream out = null;
    File pdf = new File("C:\\documents and settings\\me\\Desktop\\HelloWorld.pdf");
    File fo  = new File("C:\\somedirectory", "HelloWorld.fo");

    try {

        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

        out = new FileOutputStream(pdf);
        out = new BufferedOutputStream(out);

        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

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

        Source src = new StreamSource(fo);

        Result res = new SAXResult(fop.getDefaultHandler());

        transformer.transform(src, res);

        return pdf;

    } catch (Exception e) {

         throw new UtilException("Could not get download. Msg = "+e.getMessage());

    } finally {

         try {
             out.close();
         } catch (IOException io) {
             throw new UtilException("Could not close OutputStream. Msg = "+io.getMessage());
         }
    }
}

これは非常に具体的な問題であることに気づきましたが、どんな助けでも大歓迎です!

役に立ちましたか?

解決

過去にこのタイプの機能を実装した方法は、サーブレットがPDFファイルの内容を応答としてストリームに書き込むようにすることです。ソースコードはもう手元にありません(サーブレット/ jspの作業を行ってから少なくとも1年が経ちます)が、試してみてください:

サーブレットで、応答の出力ストリームのハンドルを取得します。応答のMIMEタイプを&quot; application / pdf&quot;に変更し、例で使用しているファイル処理をサーブレットに実行させます。 Fileオブジェクトを返す代わりに、サーブレットがファイルを出力ストリームに書き込むようにします。ファイルI / Oの例を参照し、outfile.write(...)行をresponseStream.write(...)に置き換えるだけで、実行するように設定する必要があります。出力ストリームをフラッシュして閉じ、リターンを実行すると、正しく覚えていれば、ブラウザーは応答からpdfを取得できるはずです。

他のヒント

わかりました、これは機能しました。方法は次のとおりです。

JSP:

<%@ taglib uri="utilTLD" prefix="util" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
<%@ page language="java" session="false" %>
<%@ page contentType="application/pdf" %>

<%-- Construct and initialise the PrintReportsBean --%>
<jsp:useBean id="printReportsBean" scope="request" class="some.package.PrintReportsBean" />
<jsp:setProperty name="printReportsBean" property="*"/>

<%
    // get report format as input parameter     
    ServletOutputStream servletOutputStream = response.getOutputStream();

    // reset buffer to remove any initial spaces
    response.resetBuffer(); 

    response.setHeader("Content-disposition", "attachment; filename=HelloWorld.pdf");

    // check that user is authorised to download product
    printReportsBean.getDownload(servletOutputStream);
%>

Java Beanメソッド:

//earlier in the class...
private static FopFactory fopFactory = FopFactory.newInstance();

public void getDownload(ServletOutputStream servletOutputStream) throws UtilException {

    OutputStream outputStream = null;

    File fo  = new File("C:\\some\\path", "HelloWorld.fo");

    try {

        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

        outputStream = new BufferedOutputStream(servletOutputStream);

        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, outputStream);

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

        Source src = new StreamSource(fo);

        Result res = new SAXResult(fop.getDefaultHandler());

        transformer.transform(src, res);

    } catch (Exception e) {

        throw new UtilException("Could not get download. Msg = "+e.getMessage());

    } finally {

        try {
            outputStream.close();
        } catch (IOException io) {
            throw new UtilException("Could not close OutputStream. Msg = "+io.getMessage());
        }
     }
 }

ご意見をお寄せいただきありがとうございます!

推測ですが、JSPページが返すMIMEタイプを確認しましたか?

編集:あなたが投稿したコードを実際に読んだ場合、それを設定したことがわかりますので、気にしないでください:)

edit2:JSPコード内のJSPタグ間の改行は、出力ストリームになりませんか?サーバーから返された応答をスローできますか? PDFの形式については何も知りませんが、特定の「マーカー」に依存しますか?ファイル内の特定の場所に文字がありますか? (返されるエラーメッセージは、そのように聞こえます)。

matt bに同意します、JSPタグ間のスペース。ディレクティブを入れてみてください

<%@ page trimDirectiveWhitespaces="true" %>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top