EDIT: Voir my working code dans les réponses ci-dessous.Renvoyer un fichier PDF d'un Java Bean à un JSP
En bref: Je dispose d'un fichier JSP qui appelle une méthode dans un Java Bean. Cette méthode crée un fichier PDF et, en théorie, le renvoie au JSP afin que l'utilisateur puisse le télécharger. Toutefois, lors du chargement du fichier PDF, Adobe Reader affiche l'erreur suivante: Le fichier ne commence pas par '% PDF-'.
En détail: Jusqu'à présent, la JSP appelle la méthode avec succès, le PDF est créé et le fichier JSP apparaît pour donner à l'utilisateur le fichier PDF fini. Cependant, dès qu'Adobe Reader essaie d'ouvrir le fichier PDF, une erreur se produit: Le fichier ne commence pas par '% PDF-'. Juste pour faire bonne mesure, j'ai la méthode créer le PDF sur mon bureau afin que je puisse le vérifier; quand je l'ouvre normalement dans Windows, cela semble bien. Alors pourquoi la sortie de la JSP est-elle différente?
Pour créer le PDF, j'utilise Apache FOP. Je suis l'un de leurs exemples les plus basiques, à l'exception de passer le PDF résultant à un JSP au lieu de simplement l'enregistrer sur la machine locale. J'ai suivi leurs basic usage pattern et this example code.
Voici mon fichier 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}"/>
Voici ma méthode 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());
}
}
}
Je me rends compte que cela est un problème très spécifique, mais toute aide serait grandement appréciée!
trimDirectiveWhitespaces semble très utile, bien que certains googling révèle que c'est seulement depuis JSP 2.1 (donc c'est assez nouveau). –