我有一个jpanel,它有一个相当大的高度,我想画成一个pdf,类似2-3页,有时甚至更多。 我的问题是它不会传递到下一页,它只会尝试将所有内容插入到第一页中,当页面结束时它将不会传递给下一页。 我搜索了一下,尝试了我能想到的一切,没有。 我怎么能这样做,我怎么能告诉iText它需要开始一个新的页面并继续在那里的jpanel? 这是我的代码:
try {
Document document = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C:\\HelloWorld.pdf"));
document.open();
jPanel1.addNotify();
jPanel1.validate();
PdfContentByte cb = writer.getDirectContent();
PdfTemplate tp = cb.createTemplate(600, 840);
Graphics2D g2d = tp.createGraphics(595, 840);
g2d.translate(4, 4);
g2d.scale(0.708, 0.8);
jPanel1.paint(g2d);
cb.addTemplate(tp, 0, 0);
g2d.dispose();
document.close();
} catch (DocumentException ex) {
} catch (FileNotFoundException ex) {
}
答案 0 :(得分:2)
您仅使用JPanel
创建图形(在g2d
上绘画),它本身与您的问题无关。
由于图像没有“自然”的包装边界(如单词或段落),您需要自己完成。拆分图像,即在有用的边界创建多个图像手册(取决于内容,可能需要调整paint
方法)并将它们放在不同的页面上。
答案 1 :(得分:2)
您可以创建足够大的模板并将所有JPanel内容绘制到该模板。然后使用不同的偏移量将此单个模板添加到不同的pdf页面,从而在各个页面上显示模板的不同部分。
E.g。如果是样本小组(3页高)
class MyPanel extends JPanel {
public MyPanel(Rectangle baseSize) {
setBorder(BorderFactory.createLineBorder(Color.black));
this.baseSize = baseSize;
}
public Dimension getPreferredSize() {
return new Dimension((int)baseSize.getWidth(), ((int)baseSize.getHeight()) * 3);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("Page 1", 10, 20);
g.drawRoundRect(5, 5, (int)baseSize.getWidth() - 10, (int)baseSize.getHeight() - 10, 15, 15);
g.drawString("Page 2", 10, 20 + (int)baseSize.getHeight());
g.drawRoundRect(5, 5 + (int)baseSize.getHeight(), (int)baseSize.getWidth() - 10, (int)baseSize.getHeight() - 10, 15, 15);
g.drawString("Page 3", 10, 20 + 2 * (int)baseSize.getHeight());
g.drawRoundRect(5, 5 + 2 * (int)baseSize.getHeight(), (int)baseSize.getWidth() - 10, (int)baseSize.getHeight() - 10, 15, 15);
}
final Rectangle baseSize;
}
您可以将信息传播到多个PDF格式,如下所示:
public void test() throws FileNotFoundException, DocumentException
{
MyPanel panel = new MyPanel(PageSize.A4);
panel.setSize(panel.getPreferredSize());
Document document = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("target/test-outputs/big-panel.pdf"));
document.open();
panel.addNotify();
panel.validate();
PdfContentByte cb = writer.getDirectContent();
PdfTemplate tp = cb.createTemplate(panel.getWidth(), panel.getHeight());
Graphics2D g2d = new PdfGraphics2D(tp, panel.getWidth(), panel.getHeight());
panel.paint(g2d);
g2d.dispose();
cb.addTemplate(tp, 0, -2 * PageSize.A4.getHeight());
document.newPage();
cb.addTemplate(tp, 0, -PageSize.A4.getHeight());
document.newPage();
cb.addTemplate(tp, 0, 0);
document.newPage();
cb.addTemplate(tp, 0.3333f, 0, 0, 0.3333f, PageSize.A4.getWidth() / 3, 0);
document.close();
}
如您所见,面板的某些部分可以显示为单独的页面;或者整个面板可以缩小一页显示。当然,您还可以显示小组的小部分。或旋转。或者......