iText Java to PDF:如何输出JPanel而不必将其添加到Container

时间:2013-03-07 10:48:30

标签: java swing pdf-generation jpanel itext

我有一个Java应用程序,它有一个JPanel,其中包含我想要输出到PDF的信息(使用iText)。唯一的转折是我需要在PDF上为这个JPanel提供不同的格式。由于JPanel显示在GUI上,我无法将其更改为我想要在PDF上显示的方式,因为这会更改正在显示的JPanel。所以我要做的是用我的PDF格式创建一个新的JPanel,用原始信息填充它,然后将这个新格式输出到PDF。到目前为止没问题,除了我只能将这个JPanel输出到PDF,如果它被添加到Container中。显然我不希望它,因为我不希望这个新的JPanel显示出来。我甚至试图将其设置为不可见,但这样也无法输出。

新的JPanel:

JPanel myFormattedPanel = new JPanel(); {
myFormattedPanel.setLayout(new GridLayout(2, 3, 0, 2));
myFormattedPanel.setBackground(Color.WHITE);

(...)

getContentPane().add(myFormattedPanel); //How to not need this??

输出为PDF:

Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, out);
document.open();

PdfContentByte cb = writer.getDirectContent();

float width = PageSize.A4.getWidth();
float height = PageSize.A4.getHeight() / 2;

PdfTemplate resultsPanelPdfTemplate = cb.createTemplate(width, height);
Graphics2D g2d2 = new PdfGraphics2D(resultsPanelPdfTemplate, width, height);
myFormattedPanel.paint(g2d2);
g2d2.dispose();
cb.addTemplate(resultsPanelPdfTemplate, 0, 0);

document.close();

基本上,使用iText将JPanel输出到PDF的方式是什么,而不必将其添加到Container中,或者至少不必将其显示为可见?

非常感谢。

干杯!

1 个答案:

答案 0 :(得分:1)

  • 使用setSize为组件空间绘制其内容。如果您想获得建议的尺寸,可以使用getPreferredSize
  • 使用printAll代替paintprintAll不是双缓冲的,不会受到NullPointerException的影响(根据经验可以在Windows下发生)