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} »>
</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.
mars 26, 2007 à 9:37
Norman Richards est en train d’écrire la partie PDF de jBoss/SEAM. Cela s’appelle PDF facelets: http://docs.jboss.com/seam/1.2.0.PATCH1/reference/en/html/itext.html
mars 26, 2007 à 12:23
Merci Bruno, nous avons effectivement prévu de jeter un oeil à seam-pdf et seam-mail
la question était de savoir si on pouvait utiliser ces modules seuls?
avril 9, 2007 à 12:43
Good site!!!
août 20, 2008 à 1:04
Bonjour ,
J’étais entrain de bosser sur un projet JSF , et plus précisement sur l’impression sous format PDF ( mais ça ne marchait pas chez moi , d’ailleurs je ne sais pas pkoi )
Je me suis alors dit que si je prends votre code , cela marcherait , mais malheureusement , ça marche toujours pas.
Est ce que vous auriez une idée sur d’où ça pourrait provenir ( une certaine config d’un .xml ?…)
En fait j’utilise itext-1.4.8.jar