Rani lihat banyak yang tertarik dengan artikel print langsung ke printer.
Sejujurnya artikel itu buat catatan buat nge-print transaksi POS, tapi ya memang terlalu simple dan plain cuman text doank.

Sebenarnya dasar dari printing yang digunakan ini adalah objek PrintDocument, jadi klo temen-temen pengen lebih mengenal object ini bisa baca juga artikel:


Banyak pertanyaan masuk seperti gimana jika ingin menambahkan logo atau image saat mencetak, kalau jenis font nya beda-beda tiap baris, kalau begini dan kalau begitu hehehe...
Jadinya Rani mau rangkum jejak waktu coding aplikasi POS a.k.a aplikasi kasir dalam 2 class yang bisa teman-teman coder download pada link di bawah ini:


Notes: last update printer.vb 26 Mei 2020 (bug fix)

Class PrintingFormat bisa digunakan juga dalam pembuatan report atau printing dengan object PrintDocument, contoh nya ada di artikel printing dengan format tabel.

Langsung aja kita praktekin cara menggunakan class ini ya, kedua class harus include dalam project/solution. Di bawah ini Rani kasih contoh gimana biar file Printer.vb include ke dalam project. Copy paste dulu class yang sudah di download ke dalam folder project kalian yah


Lalu buka peoject kalian dan sorot Project di solution explorer dengan mouse, klik kanan dan pilih Add -> Existing item...

Browse dan pilih class yang mau kita include kemudian klik tombol Add.


File class yang ditambahkan akan muncul di solution explorer.
!!! Jangan lupa menambahkan kedua class ya, biar ga error !!!



UI Design yang kita pakai hanya menambahkan button pada form saja, saat click button proses printing akan dimulai.



Pada jendela code Form1, Imports System.Drawing.Printing

Imports System.Drawing.Printing

Untuk data yang akan dicetak, silahkan menyesuaikan dengan keperluan. Di sini Rani kasih contoh dalam bentuk variable dan datatable aja ya, biar gampang menjelaskan nya.

Dim StoreName As String = "SERBA ADA STORE"
Dim StoreAddress As String = "Jl. Kehidupan No. 100"
Dim Img As Image = Image.FromFile("c:\logo.jpg")
Dim TransNo As String = "TCN10-20191204-001"
Dim TransDate As String = Format(Now, "yyyy-MM-dd HH:mm:ss")

'for item sales | untuk item penjualan
Dim dtItem As DataTable
Dim arrWidth() As Integer
Dim arrFormat() As StringFormat

'declaring printing format class
Dim c As New PrintingFormat

'for subtotal & qty total
Dim dblSubtotal As Double = 0
Dim dblQty As Double = 0
Dim dblPayment As Double = 50000

DataTable digunakan untuk menyimpan item jual, saya juga akan mengisi manual dalam sub sebagai berikut:
Sub Data_Load()
    dtItem = New DataTable
    With dtItem.Columns
        .Add("itemname", Type.GetType("System.String"))
        .Add("qty", Type.GetType("System.String"))
        .Add("price", Type.GetType("System.String"))
    End With

    Dim ItemRow As DataRow

    ItemRow = dtItem.NewRow()
    ItemRow("itemname") = "Taro Snack"
    ItemRow("qty") = "1"
    ItemRow("price") = "5000"
    dtItem.Rows.Add(ItemRow)

    ItemRow = dtItem.NewRow()
    ItemRow("itemname") = "Kopi Ice"
    ItemRow("qty") = "2"
    ItemRow("price") = "7000"
    dtItem.Rows.Add(ItemRow)

    ItemRow = dtItem.NewRow()
    ItemRow("itemname") = "Lolipop"
    ItemRow("qty") = "5"
    ItemRow("price") = "1000"
    dtItem.Rows.Add(ItemRow)

End Sub

Dan penggunaan class printer akan dijelaskan secara lebih detail dengan contoh code dibawah event button1_click sebagai berikut:
Private Sub Button1_Click(sender As Object, e As EventArgs) _
        Handles Button1.Click

    Data_Load()

    Printer.NewPrint()

    Printer.Print(Img, 200, 100)

    'Setting Font
    Printer.SetFont("Courier New", 11, FontStyle.Bold)
    Printer.Print(StoreName) 'Store Name | Nama Toko

    'Setting Font
    Printer.SetFont("Courier New", 8, FontStyle.Regular)
    Printer.Print(StoreAddress & ";", {280}, 0) 'Store Address | Alamat Toko

    'spacing
    Printer.Print(" ")

    Printer.Print(TransNo) ' Transaction No | Nomor transaksi
    Printer.Print(TransDate) ' Trans Date | Tanggal transaksi

    Printer.Print(" ") 'spacing
    Printer.SetFont("Courier New", 8, FontStyle.Bold) 'Setting Font
    arrWidth = {90, 40, 50, 70} 'array for column width | array untuk lebar kolom
    arrFormat = {c.MidLeft, c.MidRight, c.MidRight, c.MidRight} 'array alignment 

    'column header split by ; | nama kolom dipisah dengan ;
    Printer.Print("item;qty;price;subtotal", arrWidth, arrFormat)
    Printer.SetFont("Courier New", 8, FontStyle.Regular) 'Setting Font
    Printer.Print("------------------------------------"'line

    dblSubtotal = 0
    dblQty = 0
    'looping item sales | loop item penjualan
    For r = 0 To dtItem.Rows.Count - 1
        Printer.Print(dtItem.Rows(r).Item("itemname") & ";" & _
                      dtItem.Rows(r).Item("qty") & ";" & _
                      dtItem.Rows(r).Item("price") & ";" & _
                     (dtItem.Rows(r).Item("qty") * _
                      dtItem.Rows(r).Item("price")), arrWidth, arrFormat)
        dblQty = dblQty + CSng(dtItem.Rows(r).Item("qty"))
        dblSubtotal = dblSubtotal + (dtItem.Rows(r).Item("qty") * dtItem.Rows(r).Item("price"))
    Next

    Printer.Print("------------------------------------")
    arrWidth = {130, 120} 'array for column width | array untuk lebar kolom
    arrFormat = {c.MidLeft, c.MidRight} 'array alignment 

    Printer.Print("Total;" & dblSubtotal, arrWidth, arrFormat)
    Printer.Print("Payment;" & dblPayment, arrWidth, arrFormat)
    Printer.Print("------------------------------------")
    Printer.Print("Change;" & dblPayment - dblSubtotal, arrWidth, arrFormat)
    Printer.Print(" ")
    Printer.Print("Item Qty;" & dblQty, arrWidth, arrFormat)

    'Release the job for actual printing
    Printer.DoPrint()

End Sub

Kode lengkapnya:


Mari kita coba run dan print.


Hasilnya kira-kira sebagai berikut:


Okay, I made a mistake haha... waktu update error pertama sepertinya ada yang terhapus. Sekarang insya Allah udah di update lagi. Dan sebagai permohonan maaf Rani buatkan sekalian project sample yang bisa di download: