1

我想将我的 jcomponent(绘制大量文本和线条的自定义 paintcomponent 方法、小图像(一种小单词应用程序))导出到 PDF

我的组件是“账单”

我为此使用的方法(有效,但不推荐使用某些方法)是:

       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 方法(因此可能有更好的解决方案),如果 swing 组件非常大,它只会打印在 PDF 的一页上。

所以我需要一个“分页器”来帮助我创建 A4 大小的页面以方便打印。当jcomponent非常大时当然没有缓冲区溢出......

任何人都可以帮忙吗?

4

1 回答 1

2

执行此操作的“官方 Java”方法是让您的 JComponent 实现 Pageable 和/或 Printable,以便它知道如何将自身的一部分绘制到页面上(由图形表示)。通常,in the Printable.print(Graphics graphics, PageFormat pageFormat, int pageIndex)方法,您将通过一些常数 Y 因子乘以 pageIndex 来转换图形,考虑到标题、间隔等...

这样它也可以打印到纸上。

PDF 代码与您所拥有的非常接近,您只需每页执行一次。您可以在我的博客上找到代码,该代码基于Gert-Jan Schouten 的早期工作

于 2012-05-09T16:58:43.540 回答