Génération d’un PDF retourné (servlet) :

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 :

pdfSaveAs

 

 

 

 

 

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.

4 Réponses to “Génération d’un PDF retourné (servlet) :”

  1. Bruno Lowagie Says:

    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

  2. ziller Says:

    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?

  3. Chacalos Says:

    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


Laisser un commentaire