編集:以下の回答で私の作業コードを参照してください。
簡単に言うと、Java Bean のメソッドを呼び出す JSP ファイルがあります。このメソッドは PDF ファイルを作成し、理論的にはそれを JSP に返し、ユーザーがダウンロードできるようにします。ただし、PDF をロードすると、Adobe Reader は次のエラーを返します:ファイルは '%PDF-' で始まりません。
詳細:これまでのところ、JSP はメソッドを正常に呼び出し、PDF が作成され、JSP がユーザーに完成した PDF ファイルを提供するように見えます。ただし、Adobe Reader が PDF ファイルを開こうとすると、すぐにエラーが表示されます:ファイルが '%PDF-' で始まっていません。念のため、方法でデスクトップに PDF を作成して確認できるようにします。Windows内で通常どおり開くと、正常に表示されます。では、JSP からの出力が異なるのはなぜでしょうか。
PDF を作成するために、Apache FOPを使用しています。私は彼らの最も基本的な例の 1 つに従っていますが、結果の PDF を単純にローカル マシンに保存するのではなく、JSP に渡すことを除きます。私は彼らの基本的な使用パターンとこのコード例に従っています。
これが私の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());
}
}
}
これは非常に具体的な問題であることは承知していますが、どんな助けでも大歓迎です!