我想导出我的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非常大时,没有缓冲区溢出...
有人可以帮忙吗?
答案 0 :(得分: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