Generer de beau PDF

Toutes les astuces sur le langage Java dans Lotus Notes

Generer de beau PDF

Messagepar amahi » 16 Jan 2007 à 15:54

De plus en plus on nous demande de creer des rapports et autres.

Afin de pouvoir offrir des documents "pro", je genere des PDF en utilisant la biblioteque iText de lowagie.
ça marche nickel et c'est (relativement) bien documenté.

http://www.lowagie.com/iText/download.html
amahi
Empereur des posts
Empereur des posts
 
Message(s) : 1032
Inscrit(e) le : 08 Jan 2007 à 16:57
Localisation : Region parisienne

pour etre plus global, nous utilisons PDF Creator (gratuit )

Messagepar supfred » 23 Jan 2007 à 11:47

Ce logiciel permet de creer une imprimante virtuelle.
L'utilisateur qui veut exporter une vue ou un document notes imprime sur cette imprimante, ce qui cree le fichier.
Je crois meme que l'on peut parametré pour que le PDF généré s'ouvre automatiquement en piece jointe pour envoi par email

Faire une recherche sur PDFCreator-0_9_3_GPLGhostscript.exe
je n'arrive pas a vous le deposer en piece jointe...

Edit de l'admin => http://www.google.fr/search?sourceid=na ... script.exe
supfred
Premier posts
Premier posts
 
Message(s) : 10
Inscrit(e) le : 16 Août 2006 à 15:00

Messagepar Michael DELIQUE » 23 Jan 2007 à 13:26

Pour ce qui est de PDFCreator, il ya un tips là => http://forum.dominoarea.org/viewtopic.php?t=14713
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy

Messagepar amahi » 26 Juin 2007 à 10:55

Allez un petit exemple de iText:
Cette Classe me sert de base pour tout mes PDF. Il en herite afin d obtenir toujours le meme style, le meme entete et pied de page.
Code : Tout sélectionner
import java.net.URL;

 import java.awt.Color;
 

import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
import com.lowagie.text.pdf.PdfWriter;

import net.xxx.utilitaire.DateStamp;
import java.io.FileOutputStream;

public class PDFBase  extends PdfPageEventHelper{
   private String defaultDestination =    "/local/notesdata/domino/html/download/default.pdf";
   private String defaultPath = "/local/notesdata/domino/html/download/";

   private static String defaultEntetePortrait ="/local/notesdata/domino/icons/logo_A4_portrait.jpg";
   private static String defaultEntetePaysage="/local/notesdata/domino/icons/logo_paysage.jpg";
   private static String defaultEnteteA3="/local/notesdata/domino/icons/logo_A3.jpg";
   
   private static float _defaultMargeGauche=30;
   private static float _defaultMargeDroite=30;
   private static float _defaultMargeHaut=80;
   private static float _defaultMargeBas=30;
   
   private Document document;
   private PdfWriter writer;


   private PdfTemplate numerotation;
   private PdfTemplate entete;
   private String _destination;
   public BaseFont helv;
   /*
   * Utilisation : Etendre cette classe
   * Le constructeur est :
   * String destination: le nom du fichier dans le systeme de fichier avec le chemin d'accès
   * int i : 0 (zero), il faut absolument mettre 0 pour que les evenements s'enchaine convenablement,
   * sinon on as une boucle sans fin et une pollution des logs.
   */
   public PDFBase(String destination, int i) {
      try {

                // je construit d abord le nom du fichier en fonction de ce que je recupere (avec ou                 sans path et extension)
      if (destination.equals(""))
         _destination = defaultDestination;
      else if(destination.indexOf(".") == -1)
         _destination = defaultPath+destination+".pdf";
      else
         _destination = defaultPath+destination;
      // Attention il s agit  d un document PDF et ça n a rien a voir avec  un Document Domino    
      document = new Document();
      document.setMargins(_defaultMargeGauche, _defaultMargeDroite, _defaultMargeHaut, _defaultMargeBas);
      writer = PdfWriter.getInstance(document, new FileOutputStream(_destination));
      if(i==0)
         getWriter().setPageEvent(new PDFBase(destination,1));
      
      } catch (Exception e) {
         e.printStackTrace();
      }
      
      
    }
        // Petite fonction qui me permet a partir d'un code couleur en string d obtenir un objet Color exploitable par mes PDF
   public Color getColor(String s) {
         try {
         int pos=1;
         int len=1;
         if (s.length() == 7)
            len=2;
            
         String red = s.substring(pos,len+pos);
         pos += len;
         String green = s.substring(pos,len+pos);
         pos += len;
         String blue = s.substring(pos,len+pos);
         int r = Integer.parseInt(red,16);
         int v = Integer.parseInt(green,16);
         int b = Integer.parseInt(blue,16);
         Color resultat = new Color(r,v,b);
         return resultat;
          } catch (Exception e) {
             e.printStackTrace();
          }
          return Color.WHITE;
      }   
    public Document getDocument() {
      return document;
   }
   public String getDestination() {
      return _destination;
   }
    public PdfWriter getWriter() {
      return writer;
   }
   
   /**
   *
   * Mise en forme
   *
   **/


   public Phrase getLien(String str, String destination) {
      
      Chunk c = new Chunk(str);
      c.setFont(getFontLien());
      try {
      URL url = new URL(destination);
      c.setAnchor(url);

      } catch (Exception e) {
      }
            Phrase p = new Phrase(c);

      return p;
   }
   public Paragraph getFormatedDate(int alignement) {
      Paragraph resultat;
      resultat = new Paragraph((new DateStamp()).getAujourdhui());
      resultat.setFont(getFontStandard());
      resultat.setAlignment(alignement);
      return resultat;
   }
   protected Paragraph getText(String str, int alignement) {
      Paragraph resultat;
      resultat = new Paragraph(str);
      resultat.setFont(getFontStandard());
      resultat.setAlignment(alignement);
      return resultat;
   }
   protected Paragraph getTitre(String str) {
      Paragraph resultat;
      resultat = new Paragraph(str);
      resultat.setFont(getFontTitre());
      resultat.setAlignment(Element.ALIGN_CENTER);
      return resultat;
   }
   public Phrase getTitreEntete(String str) {
      return new Phrase(str,
                           FontFactory.getFont(
                                                FontFactory.TIMES_ROMAN,
                                                12,
                                                Font.BOLD)
                           );
 
   }

   public Image getImage() {
      Image resultat = null;
      try {

         if (getDocument().getPageSize().equals(PageSize.A4)) {
            resultat =  Image.getInstance(defaultEntetePortrait);
         } else if (getDocument().getPageSize().equals(PageSize.A3.rotate())) {
            resultat =  Image.getInstance(defaultEnteteA3);         
         } else {
            resultat =  Image.getInstance(defaultEntetePaysage);
         }


      } catch (Exception e) {
         e.printStackTrace();
      }

      return resultat;
   }
   
   /**
   *  Gestion des polices
   *
   *
   *
   **/
   private static final Font getFontLien() {
      Font font = FontFactory.getFont(FontFactory.HELVETICA, 9, Font.UNDERLINE, new Color(0, 0, 255));
      return font;
   }
   private static final Font getFontStandard() {
      Font font = FontFactory.getFont(FontFactory.HELVETICA, 9);
      return font;
   }   
   private static final Font getFontTitre() {
      Font font = FontFactory.getFont(FontFactory.HELVETICA, 18, Font.BOLD);
      return font;
   }   
   /**
   *  Gestion des evenements
   *
   *
   *
   **/






   public void onOpenDocument(PdfWriter writer, Document document) {
      try {


         
   
         numerotation = writer.getDirectContent().createTemplate(100, 100);
         numerotation.setBoundingBox(new Rectangle(-20, -20, 100, 100));
         entete= writer.getDirectContent().createTemplate(
                                                               getImage().getWidth(),
                                                               getImage().getHeight());

         entete.addImage(getImage(),
                                                  getImage().getWidth(),
                                                  0,
                                                  0,
                                                  getImage().getHeight(),
                                                  0,
                                                  0);
         helv = BaseFont.createFont("Helvetica", BaseFont.WINANSI, false);
         
      } catch (Exception e) {
            throw new ExceptionConverter(e);
        }
   }
   public void onEndPage(PdfWriter writer, Document document) {
        try {
      PdfContentByte cb = writer.getDirectContent();
          cb.saveState();
         cb.addTemplate(entete, document.left()-_defaultMargeGauche, document.top() + _defaultMargeHaut - getImage().getHeight());
      
      String xxx="Document généré par la plate-forme de gestion de projet www.xxx.net.";
      String text = "Page " + writer.getPageNumber() + " sur ";
      float textSize = helv.getWidthPoint(text, 12);
      float textHaut = document.bottom()-_defaultMargeBas/2 ;
      cb.beginText();
      cb.setFontAndSize(helv, 12);
      cb.setTextMatrix((document.right()-document.left())/3, textHaut);
      cb.showText(xxx);
      cb.endText();
      cb.addTemplate(numerotation, document.left() + textSize, textHaut);


      cb.saveState();
        }
        catch (Exception e) {
            throw new ExceptionConverter(e);
        }
    }

    public void onCloseDocument(PdfWriter writer, Document document) {
      // ICI vous pouvez finir la numerotaion de vos pages (pour avoir page 1/x)

       //numerotation.beginText();
       //numerotation.setFontAndSize(helv, 12);
       //numerotation.setTextMatrix(0, 0);
       //numerotation.showText("" + (writer.getPageNumber() - 1));
       //numerotation.endText();
    }

   

}
amahi
Empereur des posts
Empereur des posts
 
Message(s) : 1032
Inscrit(e) le : 08 Jan 2007 à 16:57
Localisation : Region parisienne

Messagepar amahi » 26 Juin 2007 à 10:59

Ensuite il faut etendre cette classe et utiliser le pdf que vous venez de creer comme suit:


Code : Tout sélectionner
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;

import java.util.Vector;
import java.util.Iterator;

import net.xxx.log.Log;

public class PDFNotification extends PDFBase {
        //
   public PDFNotification(Vector logs,  String projet, String destination, String destinataire ){
      super(destination, 0);
      getDocument().open();
      try {
         getDocument().add(getTitre(projet));
         getDocument().add(getFormatedDate(Element.ALIGN_LEFT));
         if( ! destinataire.equals("*"))
            getDocument().add(getText("Liste des documents accessible à "+destinataire, Element.ALIGN_LEFT));
         getDocument().add(getTable(logs));
      } catch (Exception e) {
         e.printStackTrace();
      }
      getDocument().close();
   }
   
   
   private PdfPTable getTable(Vector v) {
      float[] width = new float[3];
      width[0] = 67f;
      width[1] = 5f;      
      width[2] = 28f;
      PdfPTable resultat = new PdfPTable(width);
      resultat.setSpacingBefore(30f);
      resultat.setHeaderRows(1);
      resultat.addCell(getTitre("Titre"));
      resultat.addCell(getTitre("Ind."));
      resultat.addCell(getTitre("Emetteur"));
      

      Iterator iter = v.iterator();
      while (iter.hasNext()) {
         Log log = (Log) iter.next();
         resultat.addCell(getLien(log.getTitre(), log.getBase()));

         resultat.addCell(getText(log.getRevision(), Element.ALIGN_CENTER));
         resultat.addCell(getText(log.getSociete(), Element.ALIGN_CENTER));
         
      }
      
      
      
      return resultat;
   }
   
   
}
amahi
Empereur des posts
Empereur des posts
 
Message(s) : 1032
Inscrit(e) le : 08 Jan 2007 à 16:57
Localisation : Region parisienne

Messagepar Julien » 29 Juin 2007 à 10:11

C'est con c'est disponible seulement avec la V7 (JDK1.4) :cry: .

Pour la V6 il faut faire soit même son JAR...

Java version 1.4.2: for now, the official releases of iText use the JDK 1.4. We don't use newer JDKs, out of respect for the many users that aren't ready to make the change to Java 5 or Java 6 yet. People that are still using JDK 1.3: please create your own jar.
Julien
www.domlike.net

---------------------------------------------------
pour la carotte, le lapin est la parfaite incarnation du mal.
Avatar de l’utilisateur
Julien
Administrateur
Administrateur
 
Message(s) : 1046
Inscrit(e) le : 12 Avr 2005 à 10:13
Localisation : Bordeaux

Messagepar billbock » 19 Oct 2007 à 11:10

et tu fais comment pour creer ton jar??

j'ai recuperer le jar disponible sur le net

Comment l'installer?
qd j'importe mes classes itext > class not found??

PS : je suis en V6
Avatar de l’utilisateur
billbock
Modérateur
Modérateur
 
Message(s) : 310
Inscrit(e) le : 15 Fév 2007 à 13:58
Localisation : paris

Messagepar amahi » 19 Oct 2007 à 12:31

dans domino je ne sait pas trop, mais avec Eclipse si tu importe le source, tu pourra tout recompiler et generer le JAR(qui n est qu un zip renommé).
amahi
Empereur des posts
Empereur des posts
 
Message(s) : 1032
Inscrit(e) le : 08 Jan 2007 à 16:57
Localisation : Region parisienne

Messagepar billbock » 22 Oct 2007 à 08:29

ici on a pas eclipse...

en fait on a dans la V6 de domino un JDK 1.3

et apparement iText est fait pour un JDK 1.4 (V7 domino)...
Avatar de l’utilisateur
billbock
Modérateur
Modérateur
 
Message(s) : 310
Inscrit(e) le : 15 Fév 2007 à 13:58
Localisation : paris

Messagepar amahi » 22 Oct 2007 à 08:51

Le telechargement de Eclipse est libre et gratuit , de plus ce n est qu un zip. Tu decompresse le repertoire et tu lance l exe (pas d'installation qui peut etre compromise par la strategie local de securite).
Meme si iText a ete fait pour la 1.4 rien ne t empeche de voir en la recompilant avec la 1.3 (tu peu aussi essayer de recuperer les anciennes version depuis sourceforge)

Edit:
Si tu va ici:

http://threebit.net/mail-archive/itext- ... 00694.html

Tu voit qu il te suffit de recompiler le package sans com.lowagie.tools et cela devrait passer .

et ici :
http://today.java.net/pub/n/iText1.4.5
que c est à partir de la version 1.4.5 que tu ne peutplus compiler avec le JDK 1.3
amahi
Empereur des posts
Empereur des posts
 
Message(s) : 1032
Inscrit(e) le : 08 Jan 2007 à 16:57
Localisation : Region parisienne

Messagepar Arthur Filliot » 21 Juil 2011 à 10:25

Voici deux jars pour utiliser iText avec la version 6.5.
C'est une ancienne version quelque peu modifiée pour tourner avec le jdk 1.1, la doc est donc légèrement différente mais on s'y retrouve.
Arthur Filliot
Découvre Dominoarea
Découvre Dominoarea
 
Message(s) : 2
Inscrit(e) le : 20 Juil 2011 à 13:29


Retour vers Java