Java iText swing组件到多个页面

Java iText swing组件到多个页面,java,swing,pdf,itext,Java,Swing,Pdf,Itext,我有一个jpanel,它有一个相当大的高度,我想把它画成pdf格式,大约2-3页,有时甚至更多。 我的问题是,它不会传递到下一页,它只会尝试将所有内容插入第一页,当该页结束时,它不会传递到下一页。 我搜索了一下,尝试了我能找到的一切,什么都没有。 我怎样才能做到这一点,我怎样才能告诉iText它需要开始一个新的页面并继续使用jpanel呢? 这是我的密码: try { Document document = new Document(PageSize.A4);

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

您使用
JPanel
仅用于创建图形(在
g2d
上绘制),它与您的问题本身无关


由于图像没有“自然”的环绕边界(如单词或段落),所以您需要自己完成这项工作。分割图像,即在有用的边界处手动创建多个图像(取决于内容,可能需要调整
绘制
方法)并将其放置在单独的页面上。

您使用
JPanel
仅创建图形(在
g2d
上绘制),这与您的问题本身无关


由于图像没有“自然”的环绕边界(如单词或段落),所以您需要自己完成这项工作。分割图像,即在有用的边界处手动创建多个图像(取决于内容,可能需要调整
绘制方法)并将其放置在单独的页面上。

您可以创建足够大的模板,并将所有JPanel内容绘制到该模板上。然后使用不同的偏移量将此单个模板添加到不同的pdf页面,从而在各个页面上显示模板的不同部分

例如,如果是样本面板(3页高)

您可以在多个PDF PGE上传播信息,如下所示:

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

正如您所见,面板的部分可以显示为单独的页面;或者整个面板可以缩小显示在一个页面上。当然,您也可以放大显示面板的小部分。或者旋转。或者…

您可以创建一个足够大的模板,并将所有JPanel内容绘制到该模板中。然后使用不同的偏移量将此单个模板添加到不同的pdf页面,从而在各个页面上显示模板的不同部分

例如,如果是样本面板(3页高)

您可以在多个PDF PGE上传播信息,如下所示:

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

正如您所见,面板的部分可以显示为单独的页面;或者整个面板可以缩小显示在一个页面上。当然,您也可以放大显示面板的小部分。或者旋转。或者…

谢谢,我会试着研究一下,这听起来并不容易。我还发现了其他类似的东西:但我对java不太了解。无论如何,谢谢!谢谢,我会试着研究一下,这听起来并不容易。我还发现了一些其他类似的东西:但我不太懂java。无论如何,谢谢!谢谢你的想法。希望我没有要求太多,但是你知道我在哪里可以找到更多关于如何做到这一点的信息吗?这不是一个借口,但我是java的初学者,我自己没有足够的知识来理解这一点。再次感谢你,祝你新年快乐!我稍后会设法找到一些样品。目前我只通过智能手机上网。。几个小时后,我终于明白了,哈哈。我的意思是,我理解了你的意思。类似于
cb.addTemplate(tp,0,0)
cb.addTemplate(tp,0,-250)。这样,我可以通过将其余部分拖出页面来操纵模板的哪个部分。很酷,谢谢!新年快乐,很好,你找到了。我现在应该有时间查一下样品了……;)谢谢你的想法。希望我没有要求太多,但是你知道我在哪里可以找到更多关于如何做到这一点的信息吗?这不是一个借口,但我是java的初学者,我自己没有足够的知识来理解这一点。再次感谢你,祝你新年快乐!我稍后会设法找到一些样品。目前我只通过智能手机上网。。几个小时后,我终于明白了,哈哈。我的意思是,我理解了你的意思。类似于
cb.addTemplate(tp,0,0)
cb.addTemplate(tp,0,-250)。这样,我可以通过将其余部分拖出页面来操纵模板的哪个部分。很酷,谢谢!新年快乐,很好,你找到了。我现在应该有时间查一下样品了……;)