2012-10-08 2 views
5

En mi proyecto tengo que imprimir componentes JTable en un pdf con todas las personalizaciones (como bordes, colores, etc.). Para este requisito busqué un poco y encontré un código para imprimir JTable en pdfs. Pero después de imprimir, encontré que faltan los bordes de la tabla para la 1ª fila y la 1ª columna, además de que no encontré una forma de imprimir en alguna coordenada específica. Por favor, mire el código específico a continuación: -Cómo exportar un componente JTable completo en pdf a una coordenada específica

package com.jpmorgan.dqreport; 

import java.awt.BorderLayout; 
import java.awt.Graphics2D; 
import java.awt.Shape; 
import java.io.FileOutputStream; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTable; 

import com.lowagie.text.Document; 
import com.lowagie.text.PageSize; 
import com.lowagie.text.pdf.PdfContentByte; 
import com.lowagie.text.pdf.PdfWriter; 

public class JTable2Pdf extends JFrame { 
    private JTable table; 

    public JTable2Pdf() { 
    getContentPane().setLayout(new BorderLayout()); 
    createTable(); 
    } 
    private void createTable() { 
     Object[][] data = { 
       {"Kathy", "Smith", 
       "SnowboardingXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", new Integer(5), new Boolean(false)}, 
       {"John", "Doe", 
       "Rowing", new Integer(3), new Boolean(true)}, 
       {"Sue", "Black", 
       "Knitting", new Integer(2), new Boolean(false)}, 
       {"Jane", "White", 
       "Speed reading", new Integer(20), new Boolean(true)}, 
       {"Joe", "Brown", 
       "Pool", new Integer(10), new Boolean(false)} 
       }; 
     String[] columnNames = {"First Name", 
       "Last Name", 
       "Sport", 
       "# of Years", 
       "Vegetarian"}; 

    table = new JTable(data, columnNames); 

    JPanel tPanel = new JPanel(new BorderLayout()); 
    tPanel.add(table.getTableHeader(), BorderLayout.NORTH); 
    tPanel.add(table, BorderLayout.CENTER); 

    getContentPane().add(tPanel, BorderLayout.CENTER); 
    } 
    private void print() { 
    Document document = new Document(PageSize.A4.rotate()); 
    try { 
     PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C:\\jTable.pdf")); 

     document.open(); 
     PdfContentByte cb = writer.getDirectContent(); 

     cb.saveState(); 
     Graphics2D g2 = cb.createGraphics(500, 500); 

     Shape oldClip = g2.getClip(); 
     g2.clipRect(10, 0, 500, 500); 

     table.print(g2); 
     g2.setClip(oldClip); 

     g2.dispose(); 
     cb.restoreState(); 
    } catch (Exception e) { 
     System.err.println(e.getMessage()); 
    } 
    document.close(); 
    } 
    public static void main(String[] args) { 
    JTable2Pdf frame = new JTable2Pdf(); 
    frame.pack(); 
    frame.setVisible(true); 
    frame.print(); 
    } 
} 

Para sugerir alguna manera de imprimir todo el JTable en una coordenada específica.

Gracias

Respuesta

4

Hola me resolvieron el código añadiendo, como a continuación: -

cb.saveState(); 

PdfTemplate pdfTemplate = cb.createTemplate(table.getWidth(), table.getHeight()); 
Graphics2D g2 = pdfTemplate.createGraphics(table.getWidth(), table.getHeight()); 
/*g2.setColor(Color.BLACK); 
g2.drawRect(x-2, y-2, table.getWidth()+2, table.getHeight()+2);*/ 
table.print(g2); 
System.out.println("x="+x + "," + "y=" + y); 
cb.addTemplate(pdfTemplate, x, y); 
g2.dispose(); 
cb.restoreState(); 
6

Un JTable es notoriamente difícil de conseguir prestado correctamente para las imágenes (o supongo, impresión). Ver this thread en el que algunos de los gurús pesan con consejos.

Al observar de cerca las capturas de pantalla de ese hilo, sugiere que la tabla de Metal predeterminada no tiene ningún borde en el extremo izquierdo.

La tabla de Nimbus FAPL hace, sin embargo.

+2

+1 Nimbus aspecto y el estilo – mKorbel

Cuestiones relacionadas