iText - JTable to PDF - titel werden nicht angezeigt

TobKl

Mitglied
Hallo Java-Programmer,
habe das im Thread beschrieben Problem, dass mir keine Spaltentitel im pdf angezeigt werden.

Hier ein kleines Testprogramm, welches eine pdf- File erzeugt.

Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import javax.swing.JTable;
import java.awt.Insets;
import java.awt.GridLayout;
import java.io.FileOutputStream;

import javax.swing.table.DefaultTableModel;
import javax.swing.JScrollPane;

import com.lowagie.text.Document;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class Test extends JFrame {

	private JPanel contentPane;
	private JPanel panel;
	private JButton btnPdfExport;
	private JPanel panel_1;
	private JTable table;
	private JScrollPane scrollPane;


	public Test() {
		initialize();
		setVisible(true);
	}
	
	private void initialize() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new GridLayout(0, 1, 0, 0));
		contentPane.add(getPanel());
	}

	private JPanel getPanel() {
		if (panel == null) {
			panel = new JPanel();
			GridBagLayout gbl_panel = new GridBagLayout();
			gbl_panel.columnWidths = new int[]{170, 0};
			gbl_panel.rowHeights = new int[]{208, 148, 0};
			gbl_panel.columnWeights = new double[]{1.0, Double.MIN_VALUE};
			gbl_panel.rowWeights = new double[]{1.0, 1.0, Double.MIN_VALUE};
			panel.setLayout(gbl_panel);
			GridBagConstraints gbc_panel_1 = new GridBagConstraints();
			gbc_panel_1.insets = new Insets(0, 0, 5, 0);
			gbc_panel_1.fill = GridBagConstraints.BOTH;
			gbc_panel_1.gridx = 0;
			gbc_panel_1.gridy = 0;
			panel.add(getPanel_1(), gbc_panel_1);
			GridBagConstraints gbc_btnPdfExport = new GridBagConstraints();
			gbc_btnPdfExport.gridx = 0;
			gbc_btnPdfExport.gridy = 1;
			panel.add(getBtnPdfExport(), gbc_btnPdfExport);
		}
		return panel;
	}
	private JButton getBtnPdfExport() {
		if (btnPdfExport == null) {
			btnPdfExport = new JButton("pdf Export");
			btnPdfExport.addActionListener(new BtnPdfExportActionListener());
		}
		return btnPdfExport;
	}

	private class BtnPdfExportActionListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			createPdf();
		}
	}
	private JPanel getPanel_1() {
		if (panel_1 == null) {
			panel_1 = new JPanel();
			panel_1.setLayout(new GridLayout(0, 1, 0, 0));
			panel_1.add(getScrollPane_1());
		}
		return panel_1;
	}
	private JTable getTable_1() {
		if (table == null) {
			table = new JTable();
			table.setModel(new DefaultTableModel(
				new Object[][] {
					{new Integer(1), new Integer(2), "test", "test", "test", "test", "test"},
					{new Integer(1), new Integer(2), "test", "test", "test", "test", "test"},
				},
				new String[] {
				"1.Spalte", "2.Spalte", "3.Spalte", "4.Spalte", "5.Spalte", "6.Spalte", "7.Spalte"
				}
			));
		}
		return table;
	}
	private JScrollPane getScrollPane_1() {
		if (scrollPane == null) {
			scrollPane = new JScrollPane();
			scrollPane.setViewportView(getTable_1());
		}
		return scrollPane;
	}
	
	public void createPdf() {
	Document document = new Document();
	try {
	
	PdfWriter writer;
	writer = PdfWriter.getInstance(document, new FileOutputStream("JTableTest.pdf"));
	
	document.open();
	
	PdfContentByte cb = writer.getDirectContent();
	PdfTemplate tp = cb.createTemplate(500, 500);
	Graphics2D g2;
	
	g2 = tp.createGraphicsShapes(500, 500);
	
	table.print(g2);
	
	g2.dispose();
	cb.addTemplate(tp, 30, 300);
	
	} catch (Exception e) {
		System.err.println(e.getMessage());
	}
	document.close();
	}
	}

Es wird mir immer nur die Tabelle ohne den Spaltentiteln angezeigt. Könnt vielleicht am ScrollPane liegen.

Ich hoffe ihr könnt mir helfen

Viele Dank schonmal
 
Hallo TobKl,
gibt es einen Grund, warum Du eine Swing-Komponente in ein PDF exportieren möchtest? Warum machst Du es nicht grundständig, indem Du die Tabelle direkt in iText erstellst und füllst. Dafür brauchst Du insgesamt sogar noch erheblich weniger Code als bei Deinem Beispiel und Du hast viel mehr Kontrolle über das Layout. Hier mal ein einfaches Beispiel: iText Tutorials - iText Table, Java PDF API for Open, Manipulate and Creation

Viele Grüße!
 
Hallo,
viele Dank für die Antwort.
Die Tabelle wird Teil eines größeren Anwendungssystems zur Verwaltung von Terminen, vergleichbar mit einem Terminkalender, in dem sich die Daten täglich bzw. wöchentlich ändern, je nachdem was der Benutzer für Eingaben macht.
Über einen Button soll der User die Möglichkeit bekommen, die Tabelle(JTABEL mit Inhalt) als pdf zu exportieren. Die vorgeschlagene Lösung würde klappen, wenn es sich um statische Werte handeln würde, welche sich nicht oft ändern.
Gibt es vllt doch eine andere Möglichkeit, dies mit iText zu realisieren.

Viele Dank für die Antwort
 
Über einen Button soll der User die Möglichkeit bekommen, die Tabelle(JTABEL mit Inhalt) als pdf zu exportieren. Die vorgeschlagene Lösung würde klappen, wenn es sich um statische Werte handeln würde, welche sich nicht oft ändern.
Gibt es vllt doch eine andere Möglichkeit, dies mit iText zu realisieren.

Viele Dank für die Antwort

Verstehe ich nicht. Du kannst ja die Inhalte dynamisch verändern und immer wieder neue PDFs mit anderen Werten erzeugen. Im Beispiel sind feste Werte angegeben, aber Du kannst ja alles mögliche da rein stecken. Mit dem Beispiel-Code kannst Du vermutlich mehrere 100 PDF pro Sekunde generieren. Performanztechnisch sollte das kein Problem sein. Du musst einfach an Stellen wie z. B. table.addCell("1"); schlicht table.addCell(meineVariable); schreiben.
Eine weitere Alternative wäre, ein Screenshot des JTable zu machen und diesen direkt als Bild zu speichern, oder das Bitmap in ein PDF zu packen, wenn es unbedingt ein PDF sein. Besonders sinnvoll finde ich es aber ehrlich gesagt nicht.
 

Zurück
Oben