2012-05-09 35 views
1

我還想導出我的JComponent到PDF出口的JComponent與iText的PDF

我的組件是「條例(其中提請大量文本和線條的,小圖像(一種小詞的應用)定製的paintComponent方法) 「

我使用這個(工作,但有些方法已過時)的方法是:

 com.itextpdf.text.Rectangle r = new com.itextpdf.text.Rectangle(0,0,bill.getWidth(),bill.getHeight()); 

     Document document = new Document(r); 

     try { 
      PdfWriter writer; 
      writer = PdfWriter.getInstance(document, new FileOutputStream(f)); 
      document.open(); 
      PdfContentByte cb = writer.getDirectContent(); 
      PdfTemplate tp = cb.createTemplate(bill.getWidth(), bill.getHeight()); 
      Graphics2D g2d = tp.createGraphics(bill.getWidth(), bill.getHeight(), new DefaultFontMapper()); 

      bill.addNotify(); 
      bill.validate(); 

      bill.paint(g2d); 
      g2d.dispose(); 

      cb.addTemplate(tp, 0, 0); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 

     document.close(); 

它工作的很好,但有兩個大問題:該方法tp.createGraphics被棄用(所以可能會有更好的解決方案)並且如果擺動組件是v大,它只是在PDF上打印在一個單一的頁面上。

所以我需要的是一個「分頁器」來幫助我創建A4大小的頁面以便於打印。當jcomponent非常大時沒有緩衝區溢出......

任何人都可以幫忙嗎?

回答

2

這樣做的「官方Java」方法是讓JComponent實現Pageable和/或Printable,以便它知道如何將自己的部分繪製到頁面上(由Graphics表示)。通常,in the Printable.print(Graphics graphics, PageFormat pageFormat, int pageIndex)方法,你會翻譯圖形的一些常數Y因子乘以pageIndex,佔頭,墊片等...

這樣它也可以打印出來的紙張。

PDF代碼與您擁有的代碼非常接近,您只需每頁執行一次。你可以找到code on my blog here,這是基於earlier work by Gert-Jan Schouten here