Thursday, February 25, 2016

Custome-papersize pada crystal report dengan VB.NET

Ketika saya sedang membuat sebuah system aplikasi untuk seorang client. Pada system ini terdapat print out yang menggunakan kertas custom. Ukuran kertasnya width=21.49 cm, height:14cm dan saya beri nama kertas ini “wo”.

Report yang digunakan adalah crystal report dan ketika ditest dikomputer saya semua ok, hasil print out sesuai dengan keinginan. Tetapi ketika aplikasi dipasang dikomputer client, hasil print out selalu menggunakan kertas default yaitu ukuran “letter”. Hal ini bisa berubah ke ukuran kertas “wo” jika saya compile ulang aplikasinya dikomputer yang terhubung dengan printer client.

Setelah melakukan study literatur selama kurang lebih satu minggu akhirnya ditemukan solusi yang sangat bagus.

Ternyata Crystal report  menyimpan informasi format kertas yang digunakan oleh report dengan cara yang tidak portable. Dia menyimpan ID dari format kertas tersebut bukan namanya. Jadi jika dilihat dari kasus saya maka crystal report menyimpan ID dari format “wo”, bukan namanya. Masalahnya ID ini di windows tergantung dari komputernya, jadi format kertas “wo” akan memiliki ID yang berbeda dikomputer yang berbeda.

Solusinya cukup sederhana:
11. Cari pada sistem printer yang ingin Anda gunakan. Dalam kasus ini, saya menggunakan default printer.
22.  Cari ID format yang dimaksud berdasarkan nama format. Dalam hal ini saya mencari ID untuk format “wo”
33.  Setelah mendapatkan ID, tentukan PaperSize property dari report. Diarahkan ke ID format tadi.

Berikut contoh script yang dapat saya gunakan.

Mencari printer default:
       Dim objSettings As New PrinterSettings
        Dim strPrinter As String
        Try
            For Each strPrinter In PrinterSettings.InstalledPrinters
                objSettings.PrinterName = strPrinter
                If objSettings.IsDefaultPrinter Then
                    Me.T_printer.Text = strPrinter
                End If
            Next
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

Mencari ID kertas dengan nama  “wo”
       Dim doctoprint As New System.Drawing.Printing.PrintDocument()
        doctoprint.PrinterSettings.PrinterName = Me.T_printer.Text
        For i = 0 To doctoprint.PrinterSettings.PaperSizes.Count - 1
            Dim rawKind As Integer
            If doctoprint.PrinterSettings.PaperSizes(i).PaperName = "WO" Then
                rawKind = CInt(doctoprint.PrinterSettings.PaperSizes(i).GetType().GetField("kind", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic).GetValue(doctoprint.PrinterSettings.PaperSizes(i)))
                Me.T_rawkind.Text = rawKind
                Exit For
            End If
        Next

Menentukan ukuran kertas yang akan digunakan oleh report (crystal report)
mReport = New ReportDocument()

mReport.PrintOptions.PaperSize = T_rawkind.Text