编辑:在下面的答案中查看我的工作代码。
简而言之:我有一个 JSP 文件,它调用 Java Bean 中的方法。此方法创建一个 PDF 文件,理论上,将其返回给 JSP,以便用户可以下载它。但是,在加载 PDF 时,Adobe Reader 会出现错误:文件不以 '%PDF-' 开头。
详细说明:至此,JSP 成功调用了该方法,创建了 PDF,然后出现了 JSP,将完成的 PDF 文件提供给用户。但是,只要 Adobe Reader 尝试打开 PDF 文件,就会出现错误:文件不以 '%PDF-' 开头。只是为了更好地衡量,我有在我的桌面上创建 PDF 的方法,以便我可以检查它;当我在 Windows 中正常打开它时,它看起来很好。那么为什么 JSP 的输出不同呢?
要创建 PDF,我使用的是Apache FOP。我正在关注他们最基本的示例之一,除了将生成的 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());
}
}
}
我意识到这是一个非常具体的问题,但任何帮助将不胜感激!