IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Documents Java Discussion :

Fermeture d'un fichier PDF avec iText


Sujet :

Documents Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Par défaut Fermeture d'un fichier PDF avec iText
    Bonjour,

    J'ai un projet. Ce projet consiste à réaliser une appli, capable de générer des fichiers CHM, PDF, et XHTML de documentations techniques d'un projet (Java, PHP ...)
    Le concept est que j'aurais une classe de lecture de fichiers, une autre de lecture de projet (qui ne fait qu'appeler la première autant de fois qu'il y a de codes sources dans le projet), et trois autres qui se chargent d'écrire aux différents format (ces trois classe iméplementent une interface qui permet d'avoir les même nom de méthode partout).
    J'attaque aujourd'hui à la partie PDF (à mon avis la plus facile).
    Voici la classe de lecture de fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    package com.datalion.documentor.file;
     
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Hashtable;
    import java.util.Vector;
    import java.util.regex.Pattern;
     
    import com.datalion.documentor.writer.PDFWriter;
    import com.lowagie.text.DocumentException;
     
    public class FileReader 
    {
    	private static FileReader instance = null;
    	private StringBuilder content;
    	private String line;
    	private Hashtable<String,String> comments;
    	private Vector<Pattern> patterns;
    	private BufferedReader br;
    	/** Construct the FileReader
             * Set up the variables
             * You must called read(String URL) to fill in the objects
             */
    	private FileReader()
    	{
    		this.content = new StringBuilder();
    		this.line = null ;
    		this.patterns = new Vector <Pattern>();
    		this.patterns.add(Pattern.compile(Pattern.quote("/**"))); // begin comment
    		this.patterns.add(Pattern.compile(Pattern.quote(".*?"))); // continue comment
    		this.patterns.add(Pattern.compile(Pattern.quote("^.*@"))); // special comment
    		this.patterns.add(Pattern.compile(Pattern.quote("*/$"))); // end comment
    		this.comments = new Hashtable<String,String>();
    		this.br = null;
    	}
    	private static FileReader getInstance()
    	{
    		if(FileReader.instance == null)
    		{
    			FileReader.instance = new FileReader();
    		}
    		return FileReader.instance;
    	}
    	/** Read a file and put all class comments in a vector
             * @param Path of the file
             */
    	public void read(String URL)
    	{
    		try
    		{
    			br = new BufferedReader(new InputStreamReader(new FileInputStream(URL)));
    			while ((line = br.readLine()) != null) 
    			{
    				content.append("\n").append(line);
    				if(this.patterns.get(0).matcher(line).find())
    				{
    					this.comments.put("Method",line);
    				}
    				if(this.patterns.get(1).matcher(line).find())
    				{
    					this.comments.put("Other",line);
    				}	
    				if(this.patterns.get(2).matcher(line).find())
    				{
    					this.comments.put("Flag",line);
    				}
    				if(this.patterns.get(3).matcher(line).find())
    				{
    					this.comments.put("End",line);
    				}
    				System.out.println(line);
    			}
    		} 
    		catch (Exception e) 
    		{
    			e.printStackTrace();
    			return;
    		} 
    		finally 
    		{
    			try 
    			{
    				br.close();
    			} 
    			catch (IOException e) {
    				e.printStackTrace();
    				br = null;
    			}
    		}
    	}
    	public Hashtable<String,String> getComments()
    	{
    		return this.comments;
    	}
    }
    et la classe d'écriture de fichier PDF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    package com.datalion.documentor.writer;
     
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
     
    import com.lowagie.text.Document;
    import com.lowagie.text.DocumentException;
    import com.lowagie.text.Paragraph;
    import com.lowagie.text.pdf.PdfWriter;
     
    public class PDFWriter implements isWriter
    {
    	private static PDFWriter instance = null;
    	private Document doc;
    	private PDFWriter()
    	{
    		this.doc = new Document();
    	}
    	public static PDFWriter getInstance()
    	{
    		if(PDFWriter.instance == null)
    		{
    			PDFWriter.instance = new PDFWriter();
    		}
    		return PDFWriter.instance;
    	}
    	public void createFile(String URL) throws FileNotFoundException, DocumentException
    	{
    		PdfWriter.getInstance(this.doc, new FileOutputStream(URL));
    	}
    	public void openFile()
    	{
    		PDFWriter.instance.doc.open();
    	}
    	public void declareMethod(String name) throws DocumentException 
    	{
    		PDFWriter.instance.doc.add(new Paragraph(name));	
    	}
    	public void closeFile()
    	{
    		PDFWriter.instance.doc.close();
    	}
    }
    mais quand je l'execute, j'ai une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Exception in thread "main" ExceptionConverter: java.io.IOException: The document has no pages.
    	at com.lowagie.text.pdf.PdfPages.writePageTree(Unknown Source)
    	at com.lowagie.text.pdf.PdfWriter.close(Unknown Source)
    	at com.lowagie.text.pdf.PdfDocument.close(Unknown Source)
    	at com.lowagie.text.Document.close(Unknown Source)
    	at com.datalion.documentor.writer.PDFWriter.closeFile(PDFWriter.java:41)
    	at com.datalion.documentor.file.FileReader.main(FileReader.java:36)
    pourtant la méthode closeFile() ne fait que fermer le fichier PDF. il paraitrait que je n'ai pas de numéro de page sur mon PDF et que c'est donc normal ?

  2. #2
    Membre émérite Avatar de Lorantus
    Homme Profil pro
    Consultant développeur indépendant / Java/VB/C(++)/ObjectPal
    Inscrit en
    Août 2007
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant développeur indépendant / Java/VB/C(++)/ObjectPal

    Informations forums :
    Inscription : Août 2007
    Messages : 599
    Par défaut
    Cette erreur arrive lorsque le document que tu veux fermer n'a pas de page (Oups, c'est écrit dans l'erreur )

    Le document doit être ouvert avant toute écriture, par la méthode Open() de la classe Document(). Il te sera ensuite possible d'ajouter les Paragraph() que tu voudras. L'écriture correcte du fichier -enfin, le tampon restant- est faite avec la méthode close() de la classe Document. C'est bien ce que tu fais

    Je ne vois pas où tu fais l'écriture dans le document : declareMethod(String).

    NOTA : attention au risque de nullPointerException avec PDFWriter.instance.[...], il vaudrait la remplacer par PDFWriter.getInstance().[...]

  3. #3
    Membre éprouvé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Par défaut
    Ben quand je fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PDFWriter.instance.doc.open();
    j'execute bien la mêthode open() de la classe document.
    la variable doc est une variable de type Document
    et je fais open() sur le document de l'instance parce que je n'ai qu'un seul PDFWriter (singleton)

  4. #4
    Membre émérite Avatar de Lorantus
    Homme Profil pro
    Consultant développeur indépendant / Java/VB/C(++)/ObjectPal
    Inscrit en
    Août 2007
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant développeur indépendant / Java/VB/C(++)/ObjectPal

    Informations forums :
    Inscription : Août 2007
    Messages : 599
    Par défaut
    doc.open() et doc.close() ont bien lieu.

    Par contre, tu écris dans le document avec déclareMethod(...). A quel moment fais-tu cela ? L'erreur "document has no page" a lieu lorsque :
    1) le document est ouvert puis
    2) rien n'ecrit dedans puis
    3) le document est fermé.

    Parfois c'est dûe : "on croit écrire" et en faite, le traitement n'écrit rien...

    Verfiie que tu écrives bien dans le document au moins quelque chose (un System.out.println(...) dans déclareMethod(...) serait bien placé pour voir cela).

  5. #5
    Membre éprouvé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Par défaut
    oki j'ai compris


    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. création d'un fichier pdf avec iText et jsf
    Par paolo2002 dans le forum JSF
    Réponses: 9
    Dernier message: 08/12/2008, 13h54
  2. [FPDF] Créer un fichier pdf avec PHP
    Par picoloto dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 24/09/2008, 22h05
  3. création d'un fichier pdf avec iText et jsf
    Par paolo2002 dans le forum Documents
    Réponses: 1
    Dernier message: 25/06/2008, 10h10
  4. [FPDF] Génération de fichiers PDF avec PHP
    Par deY! dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 10/04/2006, 17h06
  5. [FPDF] Cherche informations pour afficher un fichier pdf avec PHP
    Par Hans_B dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 22/03/2006, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo