iText摆动组件超过一页

时间:2013-12-31 00:11:26

标签: java swing pdf itext

我有一个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) {
    }

2 个答案:

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

如您所见,面板的某些部分可以显示为单独的页面;或者整个面板可以缩小一页显示。当然,您还可以显示小组的小部分。或旋转。或者......