iText Java в PDF: как вывести JPanel, не добавляя его в контейнер
У меня есть Java-приложение, в котором есть JPanel с информацией, которую я хочу вывести в PDF (используя iText). Единственный поворот в том, что мне нужно дать этому JPanel другое форматирование в PDF. Поскольку JPanel отображается в графическом интерфейсе, я не могу изменить его так, как хочу отображать в PDF, потому что это изменит отображаемый JPanel. Итак, что я делаю, так это создаю новый JPanel с моим форматированием PDF, заполняю его информацией оригинального и затем выводю этот новый в PDF. Пока проблем нет, за исключением того, что я могу вывести эту JPanel только в PDF, если она добавлена в Контейнер. И, очевидно, я не хочу, чтобы это было, потому что я не хочу, чтобы эта новая 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();
Итак, в принципе, как можно вывести JPanel в PDF с помощью iText, не добавляя его в контейнер или, по крайней мере, не делая его видимым?
Большое спасибо заранее.
Ура!
1 ответ
- использование
setSize
дать компоненту пространство для рисования его содержимого. Ты можешь использоватьgetPreferredSize
если вы хотите получить рекомендуемый размер - использование
printAll
вместоpaint
,printAll
не является двойной буферизацией и не страдает от NullPointerException (который может возникнуть под Windows из опыта)