Home / Programmazione / Java / Esportare una JTable in PDF
Mattepuffo

Esportare una JTable in PDF

Esportare una JTable in PDF

Dopo vari problemi sono finalmente riuscito anche ad esportare la mia bella JTable in PDF con la libreria iText.

Il problema principale è che seguendo i tutorial trovati qua e la veniva salvata solo una parte della JTable.

Grazie ad alcuni suggerimenti sono riuscito a trovare la soluzione finale.

Il funzionamento è questo:

  • clicco su un JMenuItem
  • mi compare un JFileChooser per salvare
  • passo il file alla classe preposta per il PDF e riempio il file con i dati della JTable

Vi posto la classe PDF:

package com.mattepuffo.book;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;

public class ExportPdf {

public void createPdf(ArrayList<ArrayList<String>> map, String file) throws FileNotFoundException, DocumentException {
Font fontMap = new Font(Font.FontFamily.COURIER, 9);
Font fontTestata = new Font(Font.FontFamily.COURIER, 10, Font.BOLD);

Document document = new Document(PageSize.A4, -65F, -65F, 20F, 20F);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
document.open();

int[] cellWidths = {10, 50, 30, 30, 12, 30, 30};
PdfPTable pdftable = new PdfPTable(7);
pdftable.setWidths(cellWidths);

PdfPCell cellID = new PdfPCell(new Paragraph("ID", fontTestata));
cellID.setColspan(1);
PdfPCell cellTitle = new PdfPCell(new Paragraph("TITLE", fontTestata));
cellTitle.setColspan(1);
PdfPCell cellAuthor = new PdfPCell(new Paragraph("AUTHOR", fontTestata));
cellAuthor.setColspan(1);
PdfPCell cellEditor = new PdfPCell(new Paragraph("EDITOR", fontTestata));
cellEditor.setColspan(1);
PdfPCell cellPrice = new PdfPCell(new Paragraph("PRICE", fontTestata));
cellPrice.setColspan(1);
PdfPCell cellIsbn = new PdfPCell(new Paragraph("ISBN", fontTestata));
cellIsbn.setColspan(1);
PdfPCell cellNote = new PdfPCell(new Paragraph("NOTE", fontTestata));
cellNote.setColspan(1);

pdftable.addCell(cellID);
pdftable.addCell(cellTitle);
pdftable.addCell(cellAuthor);
pdftable.addCell(cellEditor);
pdftable.addCell(cellPrice);
pdftable.addCell(cellIsbn);
pdftable.addCell(cellNote);
for (int j = 0; j < map.size(); j++) {
Object[] temp = map.get(j).toArray();
for (int k = 0; k < temp.length; k++) {
PdfPCell cellMap = new PdfPCell(new Paragraph(temp[k].toString(), fontMap));
cellMap.setColspan(1);
pdftable.addCell(cellMap);
}
}
document.add(pdftable);
document.close();
}
}

Come vedete al metodo passo due parametri: map e file.

Il primo è un (ArrayList<ArrayList<String>> map e rappresenta la JTable che in pratica è formata da due array: uno per lo colonne e uno per le righe.

Qui uso PdfPTable; prima imposto le celle che fungono da testata e la larghezza delle colonne (dato dall'array widths).

Poi aggiungo le celle-testata alla pdftable.

Poi eseguo due cicli su map per scansionare colonne e righe e creo varie PdfCell e le aggiungi dinamicamente alla pdftable.

Infine aggiungo la pdftable al Document.

Non è difficile!