Java iText swing组件到多个页面
我有一个jpanel,它有一个相当大的高度,我想把它画成pdf格式,大约2-3页,有时甚至更多。 我的问题是,它不会传递到下一页,它只会尝试将所有内容插入第一页,当该页结束时,它不会传递到下一页。 我搜索了一下,尝试了我能找到的一切,什么都没有。 我怎样才能做到这一点,我怎样才能告诉iText它需要开始一个新的页面并继续使用jpanel呢? 这是我的密码:Java iText swing组件到多个页面,java,swing,pdf,itext,Java,Swing,Pdf,Itext,我有一个jpanel,它有一个相当大的高度,我想把它画成pdf格式,大约2-3页,有时甚至更多。 我的问题是,它不会传递到下一页,它只会尝试将所有内容插入第一页,当该页结束时,它不会传递到下一页。 我搜索了一下,尝试了我能找到的一切,什么都没有。 我怎样才能做到这一点,我怎样才能告诉iText它需要开始一个新的页面并继续使用jpanel呢? 这是我的密码: try { Document document = new Document(PageSize.A4);
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)代码>。这样,我可以通过将其余部分拖出页面来操纵模板的哪个部分。很酷,谢谢!新年快乐,很好,你找到了。我现在应该有时间查一下样品了……;)