我有一个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中,或者至少不必将其显示为可见?
非常感谢。
干杯!
答案 0 :(得分:1)
setSize
为组件空间绘制其内容。如果您想获得建议的尺寸,可以使用getPreferredSize
printAll
代替paint
。 printAll
不是双缓冲的,不会受到NullPointerException的影响(根据经验可以在Windows下发生)