РЕДАКТИРОВАТЬ: См. мой рабочий код в ответах ниже.
Вкратце: У меня есть файл 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());
}
}
}
Я понимаю, что это очень специфическая проблема, но любая помощь будет высоко ценится!