Le futur MonDossierWeb (Facelets) aura besoin de reprendre les fonctionnalités de l’ancien canal MonDossierWeb ; comme la génération en pdf des informations affichées à l’écran. Apres quelques essais nous avons réussi à obtenir le résultat voulu grâce à la librairie iText. Voici comment sont implantées les choses :
Tout d’abord il faut penser à importer la librairie itext-2.0.1.jar disponible ici dans le projet.
Puis, dans notre Controller qui contient (en attribut : nne, nom, dossier, annee etc.) les informations affichées à l’écran, nous ajoutons la méthode export() :
public String export() {
try {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext external = context.getExternalContext();
HttpServletResponse response = (HttpServletResponse) external.getResponse();
response = configureResponse(response , “TEST PDF”);
// création du document.
Document document = new Document(PageSize.A4,10,10,20,20);
// Document d = new Document(PageSize.A4); //portrait
// Document d = new Document(PageSize.A4.rotate()); //paysage
// configuration du document
document = configureDocument(11.5f, 14f, 0.5f);
// redirection du pdf.
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
PdfWriter writer = PdfWriter.getInstance(document, baos);
writer.setStrictImageSequence(true);
// ouverture du document.
document.open();
// configuration des fonts
Font normal = FontFactory.getFont(FontFactory.TIMES_ROMAN, 8, Font.NORMAL);
Font titre = FontFactory.getFont(FontFactory.TIMES_ROMAN, 10, Font.NORMAL);
Font header = FontFactory.getFont(FontFactory.TIMES_ROMAN, 12, Font.BOLD);
//ajout image test
Image image1 = Image.getInstance(“http://www.univ-nancy2.fr/images/logo_nu_n2.gif”);
image1.scaleAbsolute(100, 20);
document.add(image1);
//nouveau paragraphe
Paragraph p=new Paragraph(“ETAT CIVIL\n\n”,header);
p.indentationLeft();
document.add(p);
//paragraphe GENERALITES
Chunk c1=new Chunk(“GENERALITES: “, titre);
c1.setBackground(Color.cyan);
Chunk c2=new Chunk(“\nDossier : “+dossier,normal);
Chunk c3=new Chunk(“\nNNE : “+nne,normal);
Chunk c4=new Chunk(“\nNom : “+nom,normal);
Paragraph p1=new Paragraph();
p1.add(c1);p1.add(c2);p1.add(c3);p1.add(c4);
document.add(p1);
//paragraphe INSCRIPTION UNIVERSITAIRE
Chunk c5=new Chunk(“INSCRIPTION UNIVERSITAIRE: “, titre);
c5.setBackground(Color.cyan);
Chunk c6=new Chunk(“\nAnnee : “+annee,normal);
Chunk c7=new Chunk(“\nEtablissement : “+etablissement,normal);
Paragraph p2=new Paragraph();
p2.add(c5);p2.add(c6);p2.add(c7);
document.add(p2);
//paragraphe BAC
Chunk c8=new Chunk(“BAC: “, titre);
c8.setBackground(Color.cyan);
Chunk c9=new Chunk(“\nBac : “+bac,normal);
Chunk c10=new Chunk(“\nObtenu en : “+anneeobtentionbac,normal);
Paragraph p3=new Paragraph();
p3.add(c8);p3.add(c9);p3.add(c10);
document.add(p3);
// fermeture du document.
document.close();
// préparation de la reponse
response.setContentLength(baos.size());
// retour du ByteArrayOutputStream en ServletOutputStream
ServletOutputStream out = response.getOutputStream();
baos.writeTo(out);
baos.flush();
context.responseComplete();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
Vous aurez remarqué que la méthode export appelle les deux méthodes suivantes, qu’il faut donc implémenter dans le Controller:
private HttpServletResponse configureResponse(HttpServletResponse response, String fileName) {
response.setHeader(“Expires”, “0″);
response.setHeader(“Cache-Control”, “must-revalidate, post-check=0, pre-check=0″);
response.setHeader(“Pragma”, “public”);
response.setContentType(“application/pdf”);
response.addHeader(“Content-disposition”, “attachment; filename=\”" + fileName +”.pdf\”");
return response;
}
private Document configureDocument(float width, float height, float margin) {
Document document = new Document();
float widhtPage = (width / 2.54f) * 72f;
float heightPage = (height / 2.54f) * 72f;
document.setPageSize(new Rectangle(widhtPage,heightPage));
float marginPage = (margin / 2.54f) * 72f;
document.setMargins(marginPage, marginPage, marginPage, marginPage);
return document;
}
Enfin, il ne reste plus qu’à ajouter un lien dans notre page xhtml, qui va nous proposer d’enregistrer le pdf généré:
<h:commandLink id=”pdfLink” action=”#{Controller.export}”>
PDF
</h:commandLink>
Ainsi, en cliquant sur le lien ‘PDF’ vous aurez l’invitation suivante :

Il ne reste plus qu’à enregistrer le pdf et voilà, le tour et joué. Voir le résultat.
Il reste maintenant à obtenir le même résultat en mode portlet, car vous aurez remarqué qu’on le sert de l’objet HttpServletResponse pour retourner le pdf.