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