Cara mencetak struk dengan PHP EscPOS CodeIgniter Panduan Lengkap

11:43 PM
Cara mencetak struk dengan PHP EscPOS CodeIgniter Panduan Lengkap
Di Posting Oleh : wandi
Kategori : CodeIgniter Programming


Pada artikel ini, kita akan belajar mencetak data di printer kasir menggunakan PHP CodeIgniter, dengan bantuan EscPOS dan tentunya dengan penjelasannya. Saya usahakan untuk memberikan penjelasan sejelas mungkin.


Langkah dibawah dibuat berdasarkan step by step, dan diberikan download file source code disetiap langkah agar anda dapat memulai dari mana saja. 
Artikel ini mungkin berisi sangat panjang, bertujuan agar pembaca tak hanya bisa melakukan tapi bisa mengerti teori sehingga dapat membuat versi kreasinya sendiri. 
Baca dengan pelan-pelan dan santai, tulis komentar jika ada yang ditanyakan.

Langsung saja, berikut daftar isinya.



Menyiapkan printer (install dan share driver)


Printer yang saya gunakan adalah Printer MINIPOS MP-7645 (sama dengan DP7645III). Jika anda menggunakan printer lain, silahkan ikuti panduan instalasi driver sesuai tipe dan merek printer.
Klik link dibawah untuk melihat daftar printer yang dapat di support

https://github.com/mike42/escpos-php

dan ngomong-ngomong, Printer yang saya gunakan tidak terdaftar pada daftar printer yang di support, namun tetap saya coba dan hasilnya bisa bekerja dengan baik meskipun tidak semua perintah kode dapat bekerja (tidak bisa print gambar, barcode, dll).
Tidak apalah karena sudah dapat mencetak teks saja sudah cukup untuk melengkapi sistem.

  • Jika anda menggunakan windows 10, anda WAJIB menonaktifkan windows driver signature enforcement verification (jika anda memakai windows 7, abaikan langkah ini), berikut caranya
    • Klik start, cari "recovery option> klik recovery option pada advanced startup, klik restart now

  • Setelah komputer terestart sendiri, klik Troubleshoot > Advanced Options > Startup Setting

  • Kemudian, jika tampil menu seperti gambar dibawah ini, dengan keyboard, tekan nomor yang bertulis Disable driver signature enforcement (7)

  • Kemudian, Silahkan download driver printer anda. Jika anda menggunakan printer yang sama dengan saya, klik download dibawah.. namun jika anda menggunakan printer lain, install driver berdasarkan petunjuknya.
Impact Printer.rar   |   ~821KB

  • extract hasil download an kedalam folder
  • Hidupkan printer, hubungkan kabel USB dengan komputer.
  • [Jika anda pengguna Windows 10] Buka Control panel > Devices > Printers and Scanners kemudian klik Add printer, lalu klik The printer that i want isn't listed
  • [Jika anda pengguna windows 7 & 8] Buka Control panel > Hardware and Sound > Devices and Printers > Add a printer, lalu klik The printer that i want isn't listed
  • Pilih Add a local printer or network printer with manual setting (yang paling bawah) lalu klik Next

  • Jika printer sudah terhubung, maka muncul USB00x (virtual printer). pilih lalu klik next
  • Kemudian klik Have Disk > klik Browse > buka folder driver hasil download tadi > pilih sesuai os anda (64 atau 32 bit) kemudian klik Open pada file INF nya

  • Pilih DP7645III lalu klik next. 
  • Jika ada tampilan seperti dibawah ini, klik install this driver anyway
  • Pilih Do not share this printer, klik next lalu finish

  • Printer sudah terinstall.
    jika anda menggunakan printer lain, anda dapat mengikuti langkah berikutnya
  • (jika anda pengguna windows 10) Pada tampilan printers and scanners , klik printer anda lalu klik manage kemudian klik printer properties

  • (jika anda pengguna windows 7 & 8) Pada tampilan devices and printers, klik kanan pada printer lalu klik printer properties


  • Klik tab sharing > centang share this printer > beri nama pada share name (jangan ada spasi) lalu klik OK

Sekarang, komputer anda sudah terinstall driver printer dan sudah dishare didalam jaringan dengan nama printer_a (pada gambar diatas)
ingat ingat nama printer ini, karena nama ini yang kita tulis didalam kode PHP


Menyiapkan lembar kerja CodeIgniter

Jika anda ingin melewati langkah ini dan ingin langsung ke langkah berikutnya,
download source code dibawah ini.
Printkasir.rar (Menyiapkan lembar kerja)

Berikut langkah-langkahnya :

  • Download framework CodeIgniter di laman resminya

CodeIgniter.com | ~ 3MB
  • Extract isinya, masukkan kedalam folder project htdocs anda. Nama folder/project, terserah anda, namun pada artikel ini kita beri nama printkasir
  • Untuk menghilangkan index.php pada URL, buat file .htaccess di rootnya, copy paste kode berikut ini.
RewriteEngine on
RewriteCond $1 !^(index\.php|assets|images|js|css|uploads|favicon.png)
RewriteCond %(REQUEST_FILENAME) !-f
RewriteCond %(REQUEST_FILENAME) !-d
RewriteRule ^(.*)$ ./index.php/$1 [L]


  • Buka xampp, hidupkan apache, lalu akses localhost/printkasir/welcome
    Jika tampil seperti dibawah, berarti anda siap untuk melanjutkan.


Mengintegrasikan library EscPOS dengan CodeIgniter


Jika anda ingin melewati langkah ini dan ingin langsung ke langkah berikutnya (memulai dari sini),
silahkan download source code dibawah.
Printkasir.rar (Integrasi EscPos)

Berikut langkah-langkahnya :
  • Download library plugin EscposPHP by Mike42, klik link dibawah
Mike42-Escpos.rar   |   ~110KB

  • Extract isi dari file tersebut ke dalam folder /application/third_party

  • Kemudian buat library untuk memanggil autoloader.php yang terdapat didalam plugin dengan cara :
    Pada folder application/libraries, buat file bernama Escpos.php,  copy paste kode berikut:
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
class Escpos {
    public function __construct() {
        require_once APPPATH . 'third_party/Mike42/autoloader.php';
    }
}
?>

  •  Plugin sudah di integrasikan dengan CI, cukup memanggil library nya saja (di langkah berikutnya)



Belajar fungsi dasar EscPOS

berikut deskripsi dari beberapa fungsi yang mungkin sering dipakai.


  • Initialize()
    Berfungsi untuk memulai penulisan printer, selain itu juga untuk mereset settingan tulisan.
    Contoh seperti berikut
$printer->initialize();

  • text($tulisan)
    Menuliskan tulisan berupa string / huruf kedalam printer. gunakan \n untuk ganti baris.
    Contoh:
$printer->text("Contoh penulisan teks \n");


  • selectPrintMode($mode)
    Mengatur teks agar berbentuk seperti mode tertentu. ada 6 mode yang terdapat pada plugin ini
    MODE_FONT_A
    MODE_FONT_B
    MODE_EMPHASIZED
    MODE_DOUBLE_HEIGHT
    MODE_DOUBLE_WIDTH
    MODE_UNDERLINE

    Berikut contoh penulisannya
$printer->selectPrintMode(Escpos\Printer::MODE_UNDERLINE);
  • setUnderline(true/false)
    Mengatur teks agar memiliki garis bawah. Tuliskan true untuk mengaktifkan
    Contoh penulisan :
$printer->setUnderline(true);


  • setJustification($mode)
    Mengatur rata kiri, tengah, atau kanan pada teks. format penulisan parameter seperti berikut
    JUSTIFY_LEFT
    JUSTIFY_CENTER
    JUSTIFY_RIGHT
    Berikut contoh penulisannya : 
$printer->setJustification(Escpos\Printer::JUSTIFY_LEFT);


  • setFont($mode)
    Mengatur jenis font tulisan.
    Kebanyakan printer memiliki 2 jenis font, dan beberapa printer bahkan memiliki 3 font. parameternya seperti berikut:
    FONT_A
    FONT_B
    FONT_C
    berikut contoh penulisannya :
$printer->setFont(Escpos\Printer::FONT_A);


  • setLineSpacing($tinggi)
    Mengatur jarak setiap baris tulisan. parameter inputan berupa angka
    Berikut contoh penulisannya : 
$printer->setLineSpacing(40);


  • setPrintLeftMargin($jarak)
    Mengatur jarak tulisan dari tepi kiri (margin left). Parameter inputan berupa angka
    Berikut contoh penulisannya : 
$printer->setPrintLeftMargin(20);


  • setReverseColor(true/false)
    Mengatur tulisan agar warnanya terbalik, teks berwarna putih, dan background berwarna hitam
    Berikut contoh penulsiannya :
$printer->setReverseColor(true);


Mencetak bermacam-macam jenis tulisan


Sebelum menerapkan kode kode diatas, kita buat controller dan methodnya terlebih dahulu, kemudian kita tuliskan kode penulisan cetak printer didalam method tersebut.

  • Pada Application/controllers, Buat file Transaksi.php
    Copy paste kode berikut ini (penjelasan terletak di keterangan kode / comment)
<?php 
defined('BASEPATH') OR exit('No direct script access allowed');

class Transaksi extends CI_Controller {

    public function cetak_struk() {
        // Disini kita menuliskan kode penulisan cetak printer
    }
}

/* End of file Transaksi.php */
/* Location: ./application/controllers/Transaksi.php */
?>


  • Skenarionya adalah, saya ingin mencoba segala jenis bentuk teks seperti yang dijelaskan satu persatu kode diatas. sehingga terbentuk keseluruhan kode seperti berikut
    (penjelasan terletak di keterangan kode / comment)


<?php 
defined('BASEPATH') OR exit('No direct script access allowed');

class Transaksi extends CI_Controller {

    public function cetak_struk() {
        // me-load library escpos
        $this->load->library('escpos');

        // membuat connector printer ke shared printer bernama "printer_a" (yang telah disetting sebelumnya)
        $connector = new Escpos\PrintConnectors\WindowsPrintConnector("printer_a");

        // membuat objek $printer agar dapat di lakukan fungsinya
        $printer = new Escpos\Printer($connector);


        /* ---------------------------------------------------------
         * Teks biasa | text()
         */
        $printer->initialize();
        $printer->text("Ini teks biasa \n");
        $printer->text("\n");

        /* ---------------------------------------------------------
         * Select print mode | selectPrintMode()
         */
        // Printer::MODE_FONT_A
        $printer->initialize();
        $printer->selectPrintMode(Escpos\Printer::MODE_FONT_A);
        $printer->text("teks dengan MODE_FONT_A \n");
        $printer->text("\n");

        // Printer::MODE_FONT_B
        $printer->initialize();
        $printer->selectPrintMode(Escpos\Printer::MODE_FONT_B);
        $printer->text("teks dengan MODE_FONT_B \n");
        $printer->text("\n");

        // Printer::MODE_EMPHASIZED
        $printer->initialize();
        $printer->selectPrintMode(Escpos\Printer::MODE_EMPHASIZED);
        $printer->text("teks dengan MODE_EMPHASIZED \n");
        $printer->text("\n");

        // Printer::MODE_DOUBLE_HEIGHT
        $printer->initialize();
        $printer->selectPrintMode(Escpos\Printer::MODE_DOUBLE_HEIGHT);
        $printer->text("teks dengan MODE_DOUBLE_HEIGHT \n");
        $printer->text("\n");

        // Printer::MODE_DOUBLE_WIDTH
        $printer->initialize();
        $printer->selectPrintMode(Escpos\Printer::MODE_DOUBLE_WIDTH);
        $printer->text("teks dengan MODE_DOUBLE_WIDTH \n");
        $printer->text("\n");

        // Printer::MODE_UNDERLINE
        $printer->initialize();
        $printer->selectPrintMode(Escpos\Printer::MODE_UNDERLINE);
        $printer->text("teks dengan MODE_UNDERLINE \n");
        $printer->text("\n");


        /* ---------------------------------------------------------
         * Teks dengan garis bawah  | setUnderline()
         */
        $printer->initialize();
        $printer->setUnderline(Escpos\Printer::UNDERLINE_DOUBLE);
        $printer->text("Ini teks dengan garis bawah \n");
        $printer->text("\n");

        /* ---------------------------------------------------------
         * Rata kiri, tengah, dan kanan (JUSTIFICATION) | setJustification()
         */
        // Teks rata kiri JUSTIFY_LEFT
        $printer->initialize();
        $printer->setJustification(Escpos\Printer::JUSTIFY_LEFT);
        $printer->text("Ini teks rata kiri \n");
        $printer->text("\n");

        // Teks rata tengah JUSTIFY_CENTER
        $printer->initialize();
        $printer->setJustification(Escpos\Printer::JUSTIFY_CENTER);
        $printer->text("Ini teks rata tengah \n");
        $printer->text("\n");

        // Teks rata kanan JUSTIFY_RIGHT
        $printer->initialize();
        $printer->setJustification(Escpos\Printer::JUSTIFY_RIGHT);
        $printer->text("Ini teks rata kanan \n");
        $printer->text("\n");


        /* ---------------------------------------------------------
         * Font A, B dan C | setFont()
         */
        // Teks dengan font A
        $printer->initialize();
        $printer->setFont(Escpos\Printer::FONT_A);
        $printer->text("Ini teks dengan font A \n");
        $printer->text("\n");

        // Teks dengan font B
        $printer->initialize();
        $printer->setFont(Escpos\Printer::FONT_B);
        $printer->text("Ini teks dengan font B \n");
        $printer->text("\n");

        // Teks dengan font C
        $printer->initialize();
        $printer->setFont(Escpos\Printer::FONT_C);
        $printer->text("Ini teks dengan font C \n");
        $printer->text("\n");

        /* ---------------------------------------------------------
         * Jarak perbaris 40 (linespace) | setLineSpacing()
         */
        $printer->initialize();
        $printer->setLineSpacing(40);
        $printer->text("Ini paragraf dengan \nline spacing sebesar 40 \ndi printer dotmatrix \n");
        $printer->text("\n");

        /* ---------------------------------------------------------
         * Jarak dari kiri (Margin Left) | setPrintLeftMargin()
         */
        $printer->initialize();
        $printer->setPrintLeftMargin(10);
        $printer->text("Ini teks berjarak 10 dari kiri (Margin left) \n");
        $printer->text("\n");

        /* ---------------------------------------------------------
         * membalik warna teks (background menjadi hitam) | setReverseColors()
         */
        $printer->initialize();
        $printer->setReverseColors(TRUE);
        $printer->text("Warna Teks ini terbalik \n");
        $printer->text("\n");


        /* ---------------------------------------------------------
         * Menyelesaikan printer
         */
        $printer->feed(4); // mencetak 2 baris kosong, agar kertas terangkat ke atas
        $printer->close();
    }
}

/* End of file Transaksi.php */
/* Location: ./application/controllers/Transaksi.php */
?>




  • Kemudian akses localhost/printkasir/transaksi/cetak_struk
Hasilnya, memang kosong tidak ada output apapun di browser, namun printer secara otomatis mencetak tulisan dan hasilnya seperti berikut : 


Pada hasil cetakan diatas, terlihat bahwa print yang saya gunakan (Minipos MP-7645) tidak memiliki font C, tidak support setPrintLeftMargin() dan tidak support setReverseColors().

Mungkin fungsi tersebut bisa digunakan pada printer lain.

Berikut source code nya :

Printkasir.rar  (Mencetak bermacam jenis teks)


Membuat Table Struk Belanja


Seperti yang kita tahu, plugin EscPos tidak memiliki fitur table, sehingga kita harus buat sendiri menggunakan fungsi fungsi yang ada. Anda bisa saja gunakan fungsi text() dan memberikan spasi setiap kolom sehingga membentuk tabel, namun bagaimana jika isi tabel tersebut bersifat dinamis (berganti-ganti)?

Hal tersebut dapat dilakukan dengan memanipulasi string yang disediakan oleh bahasa pemrograman PHP secara global.

Pada skenario kali ini, kita akan membuat tabel yang memiliki 4 kolom terdiri dari nama barang, jumlah/qty, harga dan subtotal. Namun, kita ingin teks disetiap cellnya dapat berubah-ubah (dapat diset dengan variabel) tanpa merusak kerapian tabel.

[siap-siap berpikir kritis!]
Ide pokoknya / algoritma-nya adalah dengan memberikan 4 variabel teks yang masing-masing diberikan spasi tambahan sehingga jumlah karakter per kolom akan tetap, tak peduli berapapun karakter teksnya (pakai str_pad()). Sehingga jika kolom tersebut digabungkan satu sama lain, akan membentuk 1 baris tabel, dengan posisi teks yang tetap.



Namun, bagaimana jika 1 teks kolom memiliki jumlah karakter melebihi lebar yang ditentukan? maka, teks disetiap kolom perlu dideteksi karakter yang tumpah, lalu taruh di baris berikutnya
Algoritma tersebut dapat membentuk kode seperti berikut:
Copy paste source code berikut kedalam controller transaksi anda
(Penjelasan terletak di keterangan kode / comment) :

<?php 
defined('BASEPATH') OR exit('No direct script access allowed');

class Transaksi extends CI_Controller {

    public function cetak_struk() {
        // me-load library escpos
        $this->load->library('escpos');

        // membuat connector printer ke shared printer bernama "printer_a" (yang telah disetting sebelumnya)
        $connector = new Escpos\PrintConnectors\WindowsPrintConnector("printer_a");

        // membuat objek $printer agar dapat di lakukan fungsinya
        $printer = new Escpos\Printer($connector);

        // membuat fungsi untuk membuat 1 baris tabel, agar dapat dipanggil berkali-kali dgn mudah
        function buatBaris4Kolom($kolom1, $kolom2, $kolom3, $kolom4) {
            // Mengatur lebar setiap kolom (dalam satuan karakter)
            $lebar_kolom_1 = 12;
            $lebar_kolom_2 = 8;
            $lebar_kolom_3 = 8;
            $lebar_kolom_4 = 9;

            // Melakukan wordwrap(), jadi jika karakter teks melebihi lebar kolom, ditambahkan \n 
            $kolom1 = wordwrap($kolom1, $lebar_kolom_1, "\n", true);
            $kolom2 = wordwrap($kolom2, $lebar_kolom_2, "\n", true);
            $kolom3 = wordwrap($kolom3, $lebar_kolom_3, "\n", true);
            $kolom4 = wordwrap($kolom4, $lebar_kolom_4, "\n", true);

            // Merubah hasil wordwrap menjadi array, kolom yang memiliki 2 index array berarti memiliki 2 baris (kena wordwrap)
            $kolom1Array = explode("\n", $kolom1);
            $kolom2Array = explode("\n", $kolom2);
            $kolom3Array = explode("\n", $kolom3);
            $kolom4Array = explode("\n", $kolom4);

            // Mengambil jumlah baris terbanyak dari kolom-kolom untuk dijadikan titik akhir perulangan
            $jmlBarisTerbanyak = max(count($kolom1Array), count($kolom2Array), count($kolom3Array), count($kolom4Array));

            // Mendeklarasikan variabel untuk menampung kolom yang sudah di edit
            $hasilBaris = array();

            // Melakukan perulangan setiap baris (yang dibentuk wordwrap), untuk menggabungkan setiap kolom menjadi 1 baris 
            for ($i = 0; $i < $jmlBarisTerbanyak; $i++) {

                // memberikan spasi di setiap cell berdasarkan lebar kolom yang ditentukan, 
                $hasilKolom1 = str_pad((isset($kolom1Array[$i]) ? $kolom1Array[$i] : ""), $lebar_kolom_1, " ");
                $hasilKolom2 = str_pad((isset($kolom2Array[$i]) ? $kolom2Array[$i] : ""), $lebar_kolom_2, " ");

                // memberikan rata kanan pada kolom 3 dan 4 karena akan kita gunakan untuk harga dan total harga
                $hasilKolom3 = str_pad((isset($kolom3Array[$i]) ? $kolom3Array[$i] : ""), $lebar_kolom_3, " ", STR_PAD_LEFT);
                $hasilKolom4 = str_pad((isset($kolom4Array[$i]) ? $kolom4Array[$i] : ""), $lebar_kolom_4, " ", STR_PAD_LEFT);

                // Menggabungkan kolom tersebut menjadi 1 baris dan ditampung ke variabel hasil (ada 1 spasi disetiap kolom)
                $hasilBaris[] = $hasilKolom1 . " " . $hasilKolom2 . " " . $hasilKolom3 . " " . $hasilKolom4;
            }

            // Hasil yang berupa array, disatukan kembali menjadi string dan tambahkan \n disetiap barisnya.
            return implode($hasilBaris, "\n") . "\n";
        }   

        // Membuat judul
        $printer->initialize();
        $printer->selectPrintMode(Escpos\Printer::MODE_DOUBLE_HEIGHT); // Setting teks menjadi lebih besar
        $printer->setJustification(Escpos\Printer::JUSTIFY_CENTER); // Setting teks menjadi rata tengah
        $printer->text("Nama Toko\n");
        $printer->text("\n");

        // Data transaksi
        $printer->initialize();
        $printer->text("Kasir : Badar Wildanie\n");
        $printer->text("Waktu : 13-10-2019 19:23:22\n");

        // Membuat tabel
        $printer->initialize(); // Reset bentuk/jenis teks
        $printer->text("----------------------------------------\n");
        $printer->text(buatBaris4Kolom("Barang", "qty", "Harga", "Subtotal"));
        $printer->text("----------------------------------------\n");
        $printer->text(buatBaris4Kolom("Makaroni 250gr", "2pcs", "15.000", "30.000"));
        $printer->text(buatBaris4Kolom("Telur", "2pcs", "5.000", "10.000"));
        $printer->text(buatBaris4Kolom("Tepung terigu", "1pcs", "8.200", "16.400"));
        $printer->text("----------------------------------------\n");
        $printer->text(buatBaris4Kolom('', '', "Total", "56.400"));
        $printer->text("\n");

         // Pesan penutup
        $printer->initialize();
        $printer->setJustification(Escpos\Printer::JUSTIFY_CENTER);
        $printer->text("Terima kasih telah berbelanja\n");
        $printer->text("http://badar-blog.blogspot.com\n");

        $printer->feed(5); // mencetak 5 baris kosong agar terangkat (pemotong kertas saya memiliki jarak 5 baris dari toner)
        $printer->close();
    }
}

/* End of file Transaksi.php */
/* Location: ./application/controllers/Transaksi.php */
?>

Kemudian, buka url localhost/printkasir/transaksi/cetak_struk pada browser anda..
Printer anda akan mencetak seperti gambar dibawah ini :


Berikut source code nya
Printkasir.rar  (Mencetak struk belanja)



Kesimpulan

Setelah anda mempraktekan, silahkan coba buat model pencetakan sesuai kegunaan anda.
Jika anda sedang mengerjakan project Point of Sales, anda bisa gunakan button untuk mentrigger request ajax ke method yang digunakan untuk mencetak.
Seperti berikut :


Dan, ngomong-ngomong jika anda minat dengan sistem POS yang saya buat,
silahkan PM WA ke : 0856-0462-6572 utk demo aplikasi, harga, dan kesepakatan.

Semoga artikel ini bisa bermanfaat ..
Jangan ragu untuk memberikan kritk, saran atau pertanyaan di kolom komentar.
Sekian. terima kasih.


Btw, pada proses penulisan artikel ini, ini kertas dot matrix yang saya habiskan
wkwkwk....



Mau liat atau download source code aplikasi premium bisa disini.
Previous
Next Post »

1 comment