2010-02-10 3 views
0

C'est la situation. Je dois ajouter la génération de pdf à un programme qui a déjà la génération de PNG. Initialement les 2 classes impliquées sont: ActionUsuels D'où le constructeur de CaptureImage3D est appelé. Lorsque j'ai ajouté la génération de PDF j'ai ajouté une méthode à la classe CaptureImage3DJAVA - Bizarre NoClassDefFoundError dans: com/lowagie/textDocumentException

Avant d'ajouter la génération PDF, la génération PNG a fonctionné correctement. Mais maintenant, quand j'essaie de faire la génération PNG, je reçois un: NoClassDefFoundError: com/lowagie/text/DocumentException.

Je sais que cela signifie que la classe: DocumentException (du pot itext) ne peut pas être lu à partir du classpath mais:

  1. La méthode de génération de PDF est jamais appelé. L'exception est générée avant d'entrer dans le constructeur CaptureImage3D.
  2. Tenir compte de la méthode de génération de PDF suivant:

Code:

public void captureImagePDF(File imageFile) 
    { 

     System.out.println("Pdf appelé"); 

     // Dimension (en pixels) de l'image a sauvegarder dans le fichier 
     Dimension dim = new Dimension(512, 512); 

     // On recupere l'image (pixmap) rendue par le canvas 3D offscreen 
     BufferedImage myBufferedImage = offScreenCanvas.getOffScreenImage(dim); 

     // On recupere le contexte graphique de l'image finale de sortie 
     Graphics2D gc = myBufferedImage.createGraphics(); 

     gc.drawImage(myBufferedImage, 0, 0, null); 

     Document myPDF = new Document(PageSize.A4, 50, 50, 50, 50); 

     PdfWriter myWriter = null; 

     try 
     { 
      myWriter = PdfWriter.getInstance(myPDF, new FileOutputStream(imageFile)); 
     } 


     catch (FileNotFoundException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     catch (DocumentException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


     myPDF.open(); 
     PdfContentByte cb = myWriter.getDirectContent(); 
     cb.saveState(); 
     Image image = null; 

     try { 
      image = Image.getInstance(myBufferedImage,null); 
     } 

     catch (BadElementException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     try { 
       cb.addImage(image); 
     } 
     catch (DocumentException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
     } 


    } 

Quand je commente tous les blocs try/catch, tout fonctionne très bien !!!

Je répète encore: captureImagePDF n'est jamais appelé. Et même le constructeur de CaptureImage3D n'est jamais accédé. (il devrait être, mais l'exception est soulevée avant). Et oui, j'ai itext dans le classpath. Je trouve bizarre le fait qu'un morceau de code, qui n'est jamais appelé nulle part, provoque l'apparition de l'exception!

N'hésitez pas à demander des éclaircissements!

Une idée?

Merci

+1

Pourquoi ne pas mettre la classe manquante sur le classpath? – ron

Répondre

3

Le fait que vous avez une prise pour DocumentException signifie que le chargeur doit charger la classe, de sorte que le système puisse l'attraper. :-)

Si vous voulez éviter d'avoir le pot iText dans votre classe, attraper quelque chose de plus haut, ou (comme vous l'avez dit) ne pas attraper du tout. :-P

+1

Ceci est correct. Le classloader chargera toutes les classes qui sont "statiquement" requises par le code d'exécution. – Romain

+0

Mais j'ai importé la classe spécifique: import com.lowagie.text.DocumentException; Et j'ai mis le pot itext dans le chemin de construction Java -> Bibliothèques Quel est le problème? –

+0

@Amokrane: Le chemin de construction liste les jars pour la construction. Vous avez également besoin du même fichier jar dans le classpath, afin qu'il soit disponible au moment de l'exécution. :-) –

Questions connexes