0

これが状況です。既に PNG が生成されているプログラムに PDF 生成を追加する必要があります。最初に関係する 2 つのクラスは次 のとおりです。ActionUsuelsのコンストラクターCaptureImage3Dが呼び出される場所から。

PDF生成を追加したとき、CaptureImage3Dクラスにメソッドを追加しました。PDF 生成を追加する前は、PNG 生成は正しく機能していました。しかし、PNG 生成を実行しようとすると、: NoClassDefFoundError:が表示されcom/lowagie/text/DocumentExceptionます。

私はそれがクラスを意味することを知っています: DocumentException(itext jarから)クラスパスから読み取ることはできませんが:

  1. PDF 生成メソッドは決して呼び出されません。
  2. のコンストラクタに入る前に例外が生成されCaptureImage3Dます。
  3. 次の PDF 生成方法を検討してください。

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();
        }


  }

すべての try/catch ブロックにコメントを付けると、すべて正常に動作します!!!

繰り返しますが、captureImagePDF は呼び出されません。また、のコンストラクターでさえCaptureImage3Dアクセスされることはありません。(そうあるべきですが、例外が前に発生します)。はい、クラスパスに itext があります。

どこでも呼び出されることのないコードの一部が例外の出現を引き起こすという事実は奇妙だと思います!

説明を求めることをためらわないでください!

何か案が?

ありがとうございました

4

1 に答える 1

3

catch for があるDocumentExceptionということは、システムがそれをキャッチできるように、ローダーがクラスをロードする必要があることを意味します。:-)

クラスパスに iText jar を含める必要がないようにしたい場合は、より高いものをキャッチするか、(あなたが言ったように) まったくキャッチしないでください。:-P

于 2010-02-10T21:28:02.747 に答える