iTEXT: Aplikasi Java Swing Dan PDF


Jika aku mengembangkan aplikasi berbasis Swing, iTEXT memberikan kesempatan bagiku untuk mencetak komponen Swing ke dalam PDF dengan mudah. Salah satu contoh klasik adalah mencetak JTable langsung ke PDF. Pada kode berikut ini aku membuat sebuah JFrame yang terdiri atas sebuah JTable dan JButton untuk mencetak ke PDF:

tblUtama = new JTable(10,3);
btnCetakPDF = new JButton("CETAK PDF");
btnCetakPDF.addActionListener(
  new ActionListener() {

 public void actionPerformed(ActionEvent e) {

   Document document = new
     Document(new Rectangle(300,300));
   try {
     PdfWriter writer = PdfWriter.getInstance(
       document,
       new FileOutputStream("c:\\latihan.pdf"));
     document.open();
     PdfContentByte cb =
       writer.getDirectContent();
     Graphics2D g2 = cb.createGraphics(300,300);
     tblUtama.print(g2);
     g2.dispose();
     document.close();
   } catch (Exception ex) {
     ex.printStackTrace();
   }
 }
});
setLayout(new BorderLayout());
add(tblUtama, BorderLayout.CENTER);
add(btnCetakPDF, BorderLayout.SOUTH);

Jika program di atas dijalankan, JTable yang telah di-isi akan di-render apa adanya ke file PDF. Kegunaan lain misalnya untuk mencetak isi JTextPane secara langsung ke file PDF.

Aku akan mencoba membuat sebuah program sederhana yang menarik. Program ini terdiri atas sebuah panel yang memungkinkan pengguna untuk menggambar dengan men-drag mouse di panel. Turunan dari JPanel ini, aku beri nama PanelGambar, yang telah dilengkapi MouseMotionListener dan MouseListener untuk keperluan menggambar. Data gambar sendiri aku letakkan pada class DataGambar yang berisi List yang mengandung List of Point. Setiap List of Point ini mewakili titik-titik yang dilalui mouse saat drag dimulai hingga drag selesai.

Setelah selesai menggambar di PanelGambar, user dapat menekan tombol btnCetakPDF untuk mendapatkan versi PDF dari apa yang sudah digambarnya di PanelGambar. Kode lengkap programnya adalah:

public class LatihanSwing extends JFrame {

  private PanelGambar kanvas =
    new PanelGambar();
  private JButton btnCetakPDF =
    new JButton("CETAK PDF");

  public LatihanSwing() {
    super("Latihan iTEXT");

    btnCetakPDF.addActionListener(
      new ActionListener() {

      @Override
      public void actionPerformed(
        ActionEvent e) {
  Document doc = new Document(new
    Rectangle(kanvas.getWidth(),kanvas.getHeight()));
  try {
    PdfWriter writer = PdfWriter.getInstance(doc,
      new FileOutputStream("c:\\latihan.pdf"));
    doc.open();
    PdfContentByte cb = writer.getDirectContent();
    Graphics2D g2 = (Graphics2D) cb.createGraphics(
       kanvas.getWidth(),kanvas.getHeight());
    kanvas.print(g2);
    g2.dispose();
    doc.close();
  } catch (Exception ex) {
    ex.printStackTrace();
  }
  }
  });
  setLayout(new BorderLayout());
  add(kanvas, BorderLayout.CENTER);
  add(btnCetakPDF, BorderLayout.SOUTH);

  pack();
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setVisible(true);
}

public static void main(String[] args) {
  new LatihanSwing();
}

}

class PanelGambar extends JPanel {

  private boolean reset = true;
  private DataGambar dataGambar = new DataGambar();

  public PanelGambar() {

   super.addMouseMotionListener(
      new MouseMotionListener() {

   @Override
   public void mouseDragged(MouseEvent e) {
    if (reset) {
      reset = false;
      dataGambar.reset();
    } else {
      dataGambar.tambahPoint(e.getPoint());
    }
    repaint();
   }

   @Override
   public void mouseMoved(MouseEvent e) {}
  });

  super.addMouseListener(new MouseListener() {

    @Override
    public void mouseClicked(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {}

    @Override
    public void mouseExited(MouseEvent e) {}

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {
      reset = true;
    }

  });
 }

 @Override
 public Dimension getPreferredSize() {
   return new Dimension(500,300);
 }

 @Override
 protected void paintComponent(Graphics g) {
   super.paintComponent(g);

   List<List<Point>> lstDataGambar =
     dataGambar.getDataGambar();
   for (List<Point> lstSegment : lstDataGambar) {
     Point prevPoint = null;
     for (Point point : lstSegment) {
       if (prevPoint!=null) {
	  g.drawLine(
            (int)prevPoint.getX(),
            (int)prevPoint.getY(),
            (int)point.getX(),
            (int)point.getY());
       }
       prevPoint = point;
     }
   }
 }

}

class DataGambar {

  private List<List<Point>> lstDataGambar;
  private List<Point> lstCurrentSegment;

  public DataGambar() {
    lstDataGambar = new ArrayList<List<Point>>();
  }

  public void tambahPoint(Point point) {
    lstCurrentSegment.add(point);
  }

  public void reset() {
    lstCurrentSegment = new ArrayList<Point>();
    lstDataGambar.add(lstCurrentSegment);
  }

  public List<List<Point>> getDataGambar() {
    return lstDataGambar;
  }

}

Tentang Solid Snake
I'm nothing...

Apa komentar Anda?