Search by

rizalahmaddd / laravel-rawprint

rizalahmaddd

Print RAW ESC/P, ESC/POS and ZPL data from Laravel to RawPrint Agent without a print dialog.

Package info

github.com/rizalahmaddd/laravel-rawprint

pkg:composer/rizalahmaddd/laravel-rawprint

Statistics

Installs: 2

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-11-04 09:29 UTC

This package is auto-updated.

Last update: 2026-11-04 09:38:39 UTC


README

Package Laravel untuk RawPrint Agent. Render dokumen ESC/P di server, kirim dari browser kasir, atau kirim langsung saat Laravel dan printer ada di PC yang sama.

CI

Instalasi

Dari Packagist:

composer require rizalahmaddd/laravel-rawprint

Sebelum ada di Packagist, pakai VCS repository:

{
    "repositories": [
        { "type": "vcs", "url": "https://github.com/rizalahmaddd/laravel-rawprint" }
    ]
}
composer require rizalahmaddd/laravel-rawprint:^1.0

Lalu publish config dan asset:

php artisan vendor:publish --tag=rawprint-config
php artisan vendor:publish --tag=rawprint-assets

Provider dan facade terdeteksi otomatis lewat package discovery.

Kompatibilitas

Laravel PHP Diuji
13 8.2+ ya
12 8.2+ ya
11 8.2+ ya
10 8.1+ ya
9 8.1+ ya

CI menguji setiap generasi lewat workflow Laravel.

Dua mode

Driver Kapan dipakai Cara kirim
browser (default) Laravel di server, printer di PC kasir Browser mengirim ke 127.0.0.1:18310
direct Laravel dan printer di PC yang sama PHP mengirim lewat HTTP client

Agent hanya mendengarkan di loopback PC tempat ia terpasang. Jadi untuk aplikasi yang di-host, pakai driver browser.

Mode browser

  1. Daftarkan origin aplikasi di PC kasir:
    rawprint-agent install --origins=https://pos.example.com
  2. Tambahkan sekali di layout:
    <x-rawprint />
  3. Buat job lalu antrekan sebelum view dirender:
    use RawPrint\Laravel\Facades\RawPrint;
    
    $job = RawPrint::job('invoice-'.$order->id)
        ->view('rawprint.invoice', ['order' => $order])
        ->name('Invoice '.$order->number)
        ->copies(2);
    
    RawPrint::queue($job);
    
    return view('orders.show', compact('order'));
    Bisa juga lewat prop: <x-rawprint :jobs="[$job]" />.

Saat halaman dibuka, bridge mendeteksi agent, meminta pairing lewat modal berisi kode 6 digit, lalu mengirim job dan menunggu status printer.

Memicu cetak dari JavaScript

await RawPrintBridge.send(@json($job->payload()));

window.addEventListener('rawprint:job:done', e => console.log(e.detail));
window.addEventListener('rawprint:job:error', e => console.error(e.detail));

Event yang tersedia: rawprint:unavailable, rawprint:job:queued, rawprint:job:done, rawprint:job:pending, rawprint:job:error.

Mode direct

RAWPRINT_DRIVER=direct
RAWPRINT_TOKEN=token-dari-agent

Buat token dari PC yang sama, dengan auto-approve aktif:

rawprint-agent install --origins=https://pos.example.com --auto-approve
curl -s -X POST http://127.0.0.1:18310/pair \
  -H 'Origin: https://pos.example.com' \
  -H 'Content-Type: application/json' \
  -d '{"name":"Laravel"}'

Lalu kirim dari PHP:

$result = RawPrint::job('invoice-'.$order->id)
    ->view('rawprint.invoice', compact('order'))
    ->send();

$final = RawPrint::client()->wait($result->jobId);

Untuk antrean:

use RawPrint\Laravel\Jobs\PrintDocument;

dispatch(PrintDocument::fromPayload($job->payload(), wait: true));

Dokumen

$doc = RawPrint::document();

$doc->line('TOKO MAJU')
    ->bold()->line('INVOICE')->bold(false)
    ->row(['Item', 'Qty', 'Total'], [30, 5, 12])
    ->line(str_repeat('-', 47))
    ->align('right')->line('Total: 150.000')
    ->pageBreak();
  • Margin atas/kiri, CPI, dan kualitas diambil dari config/rawprint.php.
  • Baris panjang di-wrap, termasuk saat memakai text() untuk template.
  • Form feed otomatis setiap satu halaman penuh, dihitung dari page_height_mm, top_margin_lines, dan lines_per_inch.
  • Halaman diakhiri tepat di perforasi: FF untuk tinggi halaman bulat, ESC J untuk sisa pecahan.
  • Template Blade dirender sebagai teks biasa. Pakai {!! !!} untuk nilai, karena {{ }} meng-escape &, <, dan >.
  • Teks harus memakai codepage printer. Karakter di luar ASCII bisa tercetak salah.

Batasan agent

  • job_id idempoten 10 menit; pakai natural key seperti invoice-123, bukan UUID acak.
  • Payload maksimal 2 MiB dan copies 1–10.
  • Token browser disimpan di localStorage (rawprint.token), bukan di server.
  • Config dikirim lewat <script type="application/json">, bukan inline JavaScript, jadi tetap jalan dengan CSP script-src 'self'. Pastikan /vendor/rawprint/*.js diizinkan.
  • Kalau bridge melaporkan agent tidak berjalan padahal service aktif, periksa allowed_origins. Origin yang tidak terdaftar membuat browser memblokir respons agent.

Test

composer test