iTEXT: Aplikasi Java Swing Dan PDF
29 April 2009 Tinggalkan komentar
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; } }