Page 1 sur 1

Generer de beau PDF

MessagePublié: 16 Jan 2007 à 15:54
par amahi
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

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

MessagePublié: 23 Jan 2007 à 11:47
par supfred
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

MessagePublié: 23 Jan 2007 à 13:26
par Michael DELIQUE
Pour ce qui est de PDFCreator, il ya un tips là => http://forum.dominoarea.org/viewtopic.php?t=14713

MessagePublié: 26 Juin 2007 à 10:55
par amahi
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();
    }

   

}

MessagePublié: 26 Juin 2007 à 10:59
par amahi
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;
   }
   
   
}

MessagePublié: 29 Juin 2007 à 10:11
par Julien
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.

MessagePublié: 19 Oct 2007 à 11:10
par billbock
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

MessagePublié: 19 Oct 2007 à 12:31
par amahi
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é).

MessagePublié: 22 Oct 2007 à 08:29
par billbock
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)...

MessagePublié: 22 Oct 2007 à 08:51
par amahi
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

MessagePublié: 21 Juil 2011 à 10:25
par Arthur Filliot
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.