Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [Java] Esportazione JTable in pdf

    sto cercando di esportare la JTable in PDF tramite iText.
    ho messo su questa classe:
    codice:
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.pdf.PdfContentByte;
    import com.itextpdf.text.pdf.PdfTemplate;
    import com.itextpdf.text.pdf.PdfWriter;
    import java.awt.Dimension;
    import java.awt.Graphics2D;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import javax.swing.JTable;
    
    public class ExportPdf {
    
        public void createPdf(JTable table, String file, Dimension d) throws FileNotFoundException, DocumentException {
            int width = d.width;
            int heigth = d.height;
            System.out.println(width + " " + heigth);
            Document document = new Document();
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
            document.open();
            PdfContentByte cb = writer.getDirectContent();
            PdfTemplate tp = cb.createTemplate(width, heigth);
            Graphics2D g2 = tp.createGraphicsShapes(width, heigth);
            table.print(g2);
            g2.dispose();
            cb.addTemplate(tp, 30, 0);
            document.close();
        }
    }
    come Dimension gli passo la dimensione della jtable con il metodo getSize().
    il problema è che il file viene tagliato sia in larghezza che in altezza.
    quindi si vedono poche righe e poche colonne.
    il System.out però riporta queste dimensioni: 1799 1712
    quindi dovrebbero essere giuste.
    dove sbaglio??

  2. #2
    sostituisci Document document = new Document();

    con

    Document doc = new Document(PageSize.A4, -65F, -65F, 100F, 80F);

    devi dare alla pagina la dimensione del foglio e -65f ....... sono i margini sinistro destro superiore ed inferiore.

    fammi sapere

    ciao

  3. #3
    ho apportato quella modifica e provato.
    adesso mi visualizza una colonna in più, ma solo tre righe a fondo pagina e sopra tutto vuoto.
    ho provato a giocare un pò coi margini ma ottengo sempre lo stesso risultato.

  4. #4
    ALLORA ascolta io ti consiglio di fare una cosa.

    Io almeno faccio sempre così.

    Innanzitutto lascia quel codice che ti ho scritto io riguardo la dimensione del foglio poi non utilizzare la JTable che fa parte delle swing, ma utilizza proprio la table della libreria iText

    si chiama PdfPTable

    codice:
    PdfPTable tabel = new PdfPTable(numero di colonne);
    
    PdfPCell cell = new PdfPCell(new Paragraph("testo da visualizzare nella cella"));
    cell.setcolspan(1 se deve occupare una sola colonna oppure 2.3.4 ecc ecc);
    tabel.add(cell);
    questo lo fai per tutte le colonne basta che fai table.add(cell)

    fammi sapere e se utilizzi questa tecnica posta un pò di codice così vediamo meglio.

    Ciao

  5. #5
    si ma io usavo JTable perchè gli passavo la JTable da esportare.
    così nn saprei come fare.
    cioè:
    codice:
    public class ExportPdf { 
        public void createPdf(String file) throws FileNotFoundException, DocumentException {
            Document document = new Document(PageSize.A4, -65F, -65F, 100F, 80F);
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
            document.open();
            PdfPTable pdftable = new PdfPTable(7);
            PdfPCell cellID = new PdfPCell(new Paragraph("ID"));
            PdfPCell cellTitle = new PdfPCell(new Paragraph("TITLE"));
            PdfPCell cellAuthor = new PdfPCell(new Paragraph("AUTHOR"));
            PdfPCell cellEditor = new PdfPCell(new Paragraph("EDITOR"));
            PdfPCell cellPrice = new PdfPCell(new Paragraph("PRICE"));
            PdfPCell cellIsbn = new PdfPCell(new Paragraph("ISBN"));
            PdfPCell cellNote = new PdfPCell(new Paragraph("NOTE"));
            pdftable.addCell(cellID);
            pdftable.addCell(cellTitle);
            pdftable.addCell(cellAuthor);
            pdftable.addCell(cellEditor);
            pdftable.addCell(cellPrice);
            pdftable.addCell(cellIsbn);
            pdftable.addCell(cellNote);
            document.add(pdftable);
            document.close();
        }
    }
    mi stampa l'intestazione, però nn tutto il resto.
    quindi cmq gli devo passare tutti i dati della JTable.
    per questo facevo così prima.

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306
    Aggiungo una info, nel caso non fosse stato detto/chiarito.
    Nei PDF le coordinate verticali partono dal basso: il punto con coordinate (0, 0) è l'angolo in basso a sinistra del foglio, non quello in alto a sinistra come ci si aspetterebbe.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    CERTO ALLORA è NORMALE CHE TI STAMPA SOLO LE INTESTAZIONI.

    IO FACCIO COSì.

    NEL TABLE MODEL DELLA TUA JTABLE MI TENGO UN HASHMAP oppure un arrayList poi dipende da cosa ti serve, e cosa metti in questa tabella.

    Nel momento in cui faccio la stampa, passo al metodo tablemodel.getMappa();

    e li hai tutti i tuoi dati.

    Oppure se non vuoi fare così, prima di fare una stampa creati un metodo che ti crea non so un array in cui memorizzi i tuoi dati e poi lo passi alla stampa.

    Poi cmq se ti capita per qualche motivo di non so voler cambiare il font della scrituttra piuttosto che colore di sfondo alla tabella ecc ecc non so come la potresti gestire.

    Il mio consiglio è quello di utilizzare la table della libreria itext che è adatta per far ciò...

  8. #8
    allora, alla JTable i dati arrivano sotto questo formato: ArrayList<ArrayList<String>>
    penso che la cosa migliore sia ripassare alla classe lo stesso formato.
    quindi:
    codice:
    public class ExportPdf {
        
        public void createPdf(ArrayList<ArrayList<String>> map, String file) throws FileNotFoundException, DocumentException {
            Document document = new Document(PageSize.A4, -65F, -65F, 100F, 80F);
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
            document.open();
            PdfPTable pdftable = new PdfPTable(7);
            
            PdfPCell cellID = new PdfPCell(new Paragraph("ID"));
            cellID.setColspan(1);
            PdfPCell cellTitle = new PdfPCell(new Paragraph("TITLE"));
            cellTitle.setColspan(1);
            PdfPCell cellAuthor = new PdfPCell(new Paragraph("AUTHOR"));
            cellAuthor.setColspan(1);
            PdfPCell cellEditor = new PdfPCell(new Paragraph("EDITOR"));
            cellEditor.setColspan(1);
            PdfPCell cellPrice = new PdfPCell(new Paragraph("PRICE"));
            cellPrice.setColspan(1);
            PdfPCell cellIsbn = new PdfPCell(new Paragraph("ISBN"));
            cellIsbn.setColspan(1);
            PdfPCell cellNote = new PdfPCell(new Paragraph("NOTE"));
            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++) {
                PdfPCell cellMap = new PdfPCell();
                cellMap.setColspan(1);
                pdftable.addCell(cellMap);
            }
            document.add(pdftable);
            document.close();
        }
    }
    dentro map ci dovrebbero essere tutti i dati.
    ho pensato che per poter aggiungere le celle dovessi ciclare su map.
    però mi da una bella eccezione perchè map è nullo.
    come faccio a salvarmi "lo stato" della tabella in una mappa permanente?

  9. #9
    Allora in teoria un array, una mappa una volta salvata a meno che tu non gli fai un ArrayList map = null o coa del genere in teoria non dovrebbe mai perdersi.

    Quindi il mio consiglio è quello di metterti in debug e di visualizzare sia prima che passi il controllo al metodo per stampare il pdf che dopo se il tuo ArrayList sia veramente popolato o meno.

    Piccolo accorgimento, se le tue celle hanno sempre colspan =1 non c'è bisogno di settarlo ogni volta.



    for (int j = 0; j < map.size(); j++) { PdfPCell cellMap = new PdfPCell(); cellMap.setColspan(1); pdftable.addCell(cellMap); }
    Qui comunque ti stamperà sempre bianco nel PdfPCell ricordati di mettere il contenuto dell'ArrayList

    in teoria il codice che hai scritto non dovrebbe avere problemi.

    magari appena entri nel metodo del pdf fai

    System.out.println(map.size); vedi se almeno ha qualcosa o ti arriva già nullo qui.

  10. #10
    avevo sbagliato io.
    ho dovuto fare questa modifica qua nel JPanel dove riempio la JTable:
    codice:
        private ArrayList<ArrayList<String>> map = null;
    
        public PanelTable() {
            initComponents();
            try {
                map = dbman.select();
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            } catch (ClassNotFoundException ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            }
        }
    sbman.select() è il metodo che esegue la query.
    prima era richiamato nell'evento di un JButton e per questo poi i valori nn passavano alla classe PDF.
    solo che così mi si è rallentato un pò l'avvio del programma.

    cmq a parte questo piccolo inconveniente tutto risolto:
    codice:
    public class ExportPdf {
    
        public void createPdf(ArrayList<ArrayList<String>> map, String file) throws FileNotFoundException, DocumentException {
            Document document = new Document(PageSize.A4, -65F, -65F, 100F, 80F);
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
            document.open();
            PdfPTable pdftable = new PdfPTable(7);
    
            PdfPCell cellID = new PdfPCell(new Paragraph("ID"));
            cellID.setColspan(1);
            PdfPCell cellTitle = new PdfPCell(new Paragraph("TITLE"));
            cellTitle.setColspan(1);
            PdfPCell cellAuthor = new PdfPCell(new Paragraph("AUTHOR"));
            cellAuthor.setColspan(1);
            PdfPCell cellEditor = new PdfPCell(new Paragraph("EDITOR"));
            cellEditor.setColspan(1);
            PdfPCell cellPrice = new PdfPCell(new Paragraph("PRICE"));
            cellPrice.setColspan(1);
            PdfPCell cellIsbn = new PdfPCell(new Paragraph("ISBN"));
            cellIsbn.setColspan(1);
            PdfPCell cellNote = new PdfPCell(new Paragraph("NOTE"));
            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()));
                    cellMap.setColspan(1);
                    pdftable.addCell(cellMap);
                }
            }
    
            document.add(pdftable);
            document.close();
        }
    }
    grazie!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.