ByPass Print Dialog at Jasper Report

Buat teman-teman yang belum tahu bagaimana cara-nya mencetak laporan tanpa mengeluarkan print dialog di Jasper Report, mungkin tulisan ini bisa sedikit membantu teman-teman yang sedang kebingungan :) . Ok sebelum mulai latihannya, ada beberapa perlengkapan yang harus kita persiapkan dan perlengkapan yang digunakan pada tulisan kali ini yaitu :
1. JDK 1.6_06
2. NetBeans IDE 6.1
3. Jasper Report 3.0.0
4. MySQL 5.0.51a

Pada tulisan kali ini, kita akan mencoba menambahkan fasilitas by pass print dialog ini di aplikasi yang sudah pernah dibuat pada tutorial Membuat Master Detail Report kemarin.

Untuk teman-teman yang belum tahu bagaimana cara membuat report, silahkan baca dahulu tutorial kemarin. Dan untuk teman-teman yang sudah tahu, sekarang download-lah NetBeans Project dari tutorial kemarin disini. Setelah proses download selesai, sekarang ekstrak dan bukalah dari NetBeans IDE

Karena library jasper report tidak ikut di sertakan pada tutorial kemarin, maka ketika teman-teman membuka NetBeans Project dari tutorial kemarin akan mengeluarkan pesan error seperti gambar dibawah ini :
Resolve
Dialog Error Reference Problem

Agar tidak terdapat masalah pada proses penambahan library yang akan teman-teman lakukan, sekarang editlah dahulu file project.properties yang terdapat pada direktori NamaProject/nbproject/project.properties. Carilah baris seperti dibawah ini :

18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
excludes=
file.reference.commons-beanutils-1.7.jar=library/commons-beanutils-1.7.jar
file.reference.commons-collections-2.1.jar=library/commons-collections-2.1.jar
file.reference.commons-digester-1.7.jar=library/commons-digester-1.7.jar
file.reference.commons-javaflow-20060411.jar=library/commons-javaflow-20060411.jar
file.reference.commons-logging-1.0.2.jar=library/commons-logging-1.0.2.jar
file.reference.jasperreports-2.0.2.jar=library/jasperreports-2.0.2.jar
file.reference.jdt-compiler-3.1.1.jar=library/jdt-compiler-3.1.1.jar
file.reference.jfreechart-1.0.0.jar=library/jfreechart-1.0.0.jar
includes=**
jar.compress=false
javac.classpath=\
    ${libs.MySQLDriver.classpath}:\
    ${file.reference.commons-beanutils-1.7.jar}:\
    ${file.reference.commons-collections-2.1.jar}:\
    ${file.reference.commons-digester-1.7.jar}:\
    ${file.reference.commons-javaflow-20060411.jar}:\
    ${file.reference.jasperreports-2.0.2.jar}:\
    ${file.reference.jdt-compiler-3.1.1.jar}:\
    ${file.reference.commons-logging-1.0.2.jar}:\
    ${file.reference.jfreechart-1.0.0.jar}
# Space-separated list of extra javac options
javac.compilerargs=

Kemudian hapuslah seluruh reference ke library yang lama hingga menjadi seperti dibawah ini :

18
19
20
21
22
23
24
excludes=
includes=**
jar.compress=false
javac.classpath=\
    ${libs.MySQLDriver.classpath}:\
# Space-separated list of extra javac options
javac.compilerargs=

Setelah melakukan penyimpanan pada file project.properties, sekarang tambahkanlah library-library yang diperlukan dengan cara klik kanan node Library di Project Inspector kemudian pilih Add JAR/Folder seperti gambar dibawah ini:
AddLib
Menambahkan library jasper report ke dalam NetBeans IDE

Klo sudah, sekarang bukalah file FormReport kemudian tambahkanlah event pada button Print dengan cara klik kanan pada button Print kemudian pilih Events > Action > actionPerformed[jButton3ActionPerformed] seperti gambar dibawah ini :
AddEvent
Menambahkan event pada button print

Sekarang gantilah baris dibawah ini :

138
139
140
141
    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        JOptionPane.showMessageDialog(null, "Maaf fasilitas ini belum aktif !!");
    }

menjadi seperti ini :

138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
        this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
 
        Properties systemProp = System.getProperties();
 
        // Ambil current dir
        String currentDir = systemProp.getProperty("user.dir");
 
        File dir = new File(currentDir);
        String reportName = "RptMaster.jrxml";
        String reportDirName = "Report";
 
        File fileRpt;
        String fullPath = "";
        if (dir.isDirectory()) {
            String[] isiDir = dir.list();
            for (int i = 0; i < isiDir.length; i++) {
                fileRpt = new File(currentDir + File.separatorChar + isiDir[i] + File.separatorChar +
                        reportDirName + File.separatorChar + reportName);
 
                if (fileRpt.isFile()) { // Cek apakah file RptMaster.jrxml ada
                    fullPath = fileRpt.toString();
                    System.out.println("Found Report File at : " + fullPath);
                } // end if
            } // end for i
        } // end if
 
        // Ambil Direktori tempat file RptMaster.jrxml berada
        String[] subRptDir = fullPath.split(reportName);
        String reportDir = subRptDir[0];
        System.out.println("Report Directory at : " + reportDir);
 
        // Ambil Kode Kategori
        final String paramKdKategori = jComboBox1.getSelectedItem().toString();
        Connection con = null;
        try {
            String jdbcDriver = "com.mysql.jdbc.Driver";
            Class.forName(jdbcDriver);
            String url = "jdbc:mysql://localhost/rptmasterdetail";
            String user = "root";
            String pass = "rahasia";
 
            con = (Connection) DriverManager.getConnection(url, user, pass);
            Statement stm = (Statement) con.createStatement();
 
            // Persiapkan parameter untuk Report
            Map<string, Object> parameters = new HashMap<string, Object>();
            parameters.put("PRM_KD_KATEGORI", paramKdKategori);
            parameters.put("SUBREPORT_DIR", reportDir);
 
            try {
                JasperReport JRpt = JasperCompileManager.compileReport(fullPath);
                JasperPrint JPrint = JasperFillManager.fillReport(JRpt, parameters, con);
                // JasperViewer.viewReport(JPrint, false);
                JasperPrintManager.printPage(JPrint, 0, false);
            } catch (Exception rptexcpt) {
                System.out.println("Report Can't view because : " + rptexcpt);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        this.setCursor(Cursor.getDefaultCursor());
    }

Note :

  • Sesuaikan konfigurasi koneksi database dengan konfigurasi yang terdapat pada komputer anda.
  • Tekan kombinasi tombol Ctrl+Shift+I untuk automatic import, jika terdapat baris kode yang berwarna merah
  • Setelah melakukan proses penyimpanan sekarang coba jalankanlah dengan menekan tombol F6 kemudian tekanlah tombol Print, dan jika tidak ada pesan kesalahan maka pada output Window akan menampilkan pesan seperti dibawah ini dan printer akan otomatis mencetak laporan kita tanpa mengeluarkan Print Dialog lagi :) :

    Found Report File at : /home/martin/Desktop/RptMasterDetail/dist/Report/RptMaster.jrxml
    Found Report File at : /home/martin/Desktop/RptMasterDetail/build/Report/RptMaster.jrxml
    Report Directory at : /home/martin/Desktop/RptMasterDetail/build/Report/
    

    Happy NetBeaning All :)

    Tags:

    27 Responses to “ByPass Print Dialog at Jasper Report”

    1. fny says:

      Mas, mau tanya ya. User yg menggunakan program saya kn menggunakan linux. Wkt saya buka report dari program saya (yg djalankan di windows), report tampil. Lalu ketika klik tombol printer, muncul printer dialog dan bisa nge-print. Tetapi ketika user menjalankan di linux, report bisa tampil, tapi printer dialog tdk tampil dan tdk bisa nge-print. Gmn caranya ya mas agar di komp user bisa muncul printer dialog? Thx sebelumnya. :)

    2. Thanto says:

      mas gimana listing program jasper report pada netbean 6.5 menggunakan win Xp

    3. penanya says:

      mas,,mau nanya nie..
      Klo yg mau diprint tu lebih dari 1 halaman gmn ya?
      code pada baris 193 :
      JasperPrintManager.printPage(JPrint, 0, false);
      angka 0 itu kan pageIndex ya..klo aq pake angka 0 yang diprint hanya halaman 1 saja,,klo pake angka 1 yang diprint halaman 2 saja..
      Gmn ya caranya klo yg mau diprint itu lebih dari satu halaman ??

      Terima kasih sebelumnya …

    4. mukti 13:36:

      Selamat malam..
      Mas mo tanya..kalo ini “SUBREPORT_DIR” pada baris 187 apa ya..? (lengkapnya sbb: parameters.put(“SUBREPORT_DIR”, reportDir);)

      Baris 187 itu maksudnya kita mengirimkan parameter path direktori report yg udah kita ditemukan ke jasper, dan hasilnya di tampung di parameter dengan nama SUBREPORT_DIR begitu.

      saya udah kopi-paste dan coba sesuaikan dg prg saya, tp ada message error sbb:

      log4j:WARN No appenders could be found for logger (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
      log4j:WARN Please initialize the log4j system properly.

      mungkin di baris 187 yg kurang sesuai dg prgm saya. Bisa kasih masukkan..
      Terima Kasih sebelumnya

      Yang salah sepertinya bukan di baris 187 nya mas, tapi kayaknya nih kompatibilitas di jaspernya. Mungkin bisa coba library yg sama.

    5. mukti says:

      Selamat malam..
      Mas mo tanya..kalo ini “SUBREPORT_DIR” pada baris 187 apa ya..? (lengkapnya sbb: parameters.put(“SUBREPORT_DIR”, reportDir);)

      saya udah kopi-paste dan coba sesuaikan dg prg saya, tp ada message error sbb:

      log4j:WARN No appenders could be found for logger (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
      log4j:WARN Please initialize the log4j system properly.

      mungkin di baris 187 yg kurang sesuai dg prgm saya. Bisa kasih masukkan..
      Terima Kasih sebelumnya

    6. Bisa pastein codenya ? Trs untuk menjalankan animasinya gmn ? Setahu saya Swing itu cuma jalan di 1 Thread namanya EDT klo ga salah. Nah maksudnya yaitu setiap event/proses hanya bisa dieksekusi dalam 1 waktu, jadi ga bakalan bisa jika kita ingin dalam 1 waktu ada 2 proses yang berjalan (dlm hal ini menjalankan animasinya waktu mencetak laporan, soalnya Swing menunggu proses pencetakan selesai baru deh dia menjalankan animasinya). Nah untuk mengakomodasi hal ini, kita hrs buat 1 thread lain yang tugasnya menjalankan animasi kita tersebut, nah daripada susah2x bikin Thread sendiri knp ga pakai SwingWorker yang udah disediakan di java 1.6 ?

      Sedangkan untuk pertanyaan ke 2 apasih SwingWorker ini ??
      SwingWorker itu adalah sebuah utility class yang baru ditambahkan di Java 1.6 (klo ga salah juga), nah fungsi dari class ini adalah sebagai pembantu programmer Swing ketika ingin menjalankan 2 proses atau lebih dalam 1 waktu secara bersama-sama.

      Untuk detail penjelasan SwingWorker mungkin bisa baca-baca disini :-> http://en.wikipedia.org/wiki/SwingWorker

      NOTE: Btw jangan dimakan mentah-mentah ya penjelasan saya, lebih baik baca dokumentasi dan link yg saya berikan. Penjelasan yang saya berikan itu berdasarkan pada asumsi saya pribadi, jadi bisa saja beda dengan yg lain :) Jadi ya baca-baca aja link yg terkait :)

      Happy Coding :)

    Leave a Reply

    [+] adsenseid emoticons by Martinus Ady H. Modified from nartzco source code.