Isu yang Perlu Diperbaiki di Library Printer — io.github.ringga-dev:kmp_printer:2.3.5
Untuk dikirim ke maintainer library kmp_printer. App saat ini workaround via UI helper, tapi fix ideal di library.
1) leftMargin tanpa autoCenter menyebabkan kanan terpotong / overflow
Lokasi library:
commonMain/ngga/ring/printer/util/escpos/ESCPosCommandBuilder.kt:fromPrinterConfig (lihat decompile di sumber kmp_printer-2.3.5-sources.jar)
Kode saat ini (ringkas):
val dots = if (config.paperWidthDots > 0) config.paperWidthDots else ((config.paperWidth - 10)*8).coerceAtLeast(384)
val dotsPerChar = dots.toDouble() / config.characterPerLine
val printWidth = if (config.autoCenter) (dots - 2*config.leftMargin).coerceAtLeast(1) else dots
val effectiveChars = if (config.autoCenter) (printWidth/dotsPerChar).toInt().coerceAtLeast(1) else config.characterPerLine
val actualTextWidth = effectiveChars * dotsPerChar
val centeringPadding = if (config.autoCenter) ((printWidth - actualTextWidth)/2).toInt().coerceAtLeast(0) else 0
ESCPosConfig(
charsPerLine = effectiveChars,
paperWidthDots = actualTextWidth.toInt(), // = dots saat OFF
leftMargin = config.leftMargin + centeringPadding
).also { hardwareTotalDots = dots }
Masalah:
autoCenter==false → printWidth = dots (misal 384), paperWidthDots = dots (384), leftMargin = 20. Total lebar yang dipakai = leftMargin (20) + actualTextWidth (384) = 404 > dots (384) → melebihi lebar fisik kertas → sisi kanan terpotong / wrap. User set kiri 20, kanan ikut kena.
autoCenter==true → printWidth = dots - 2*left, jadi margin simetris kiri & kanan, tidak overflow tapi printable mengecil di kedua sisi.
Yang diharapkan:
leftMargin seharusnya offset murni tanpa mengorbankan kanan melebihi kertas: lebar printable = dots - leftMargin (kanan tetap di tepi kertas). Jika user set kiri 20 pada 384 dots, printable harus 364 dots (~30 char pada 32cpl).
autoCenter seharusnya opsional untuk centering, bukan satu-satunya cara agar tidak overflow.
Dampak di app:
User Diggo POS bingung: set kiri 10 kanan jadi sempit/terpotong. Workaround app saat ini hanya tampil warning & sarankan autoCenter=true atau left 0–4/0–8.
Usulan fix di library (patch fromPrinterConfig):
// Before
val printWidth = if (config.autoCenter) (dots - 2*config.leftMargin).coerceAtLeast(1) else dots
val effectiveChars = if (config.autoCenter) (printWidth/dotsPerChar).toInt().coerceAtLeast(1) else config.characterPerLine
// After (fix)
val printWidth = if (config.autoCenter) (dots - 2*config.leftMargin).coerceAtLeast(1) else (dots - config.leftMargin).coerceAtLeast(1)
val effectiveChars = (printWidth / dotsPerChar).toInt().coerceAtLeast(1)
// actualTextWidth & centeringPadding tetap, tapi sekarang tidak overflow saat OFF
Dengan ini OFF + left=20 → printWidth=364, effectiveChars≈30 (bukan 32), actualTextWidth≈364, leftMargin=20 → total 384 pas, tidak terpotong. ON tetap simetris.
Alternatif lebih lengkap: tambah field rightMargin di PrinterConfig agar kiri/kanan bisa diatur independen, bukan hanya left dengan autoCenter mirroring.
data class PrinterConfig(
val leftMargin: Int = 0,
val rightMargin: Int = 0, // NEW
val autoCenter: Boolean = false,
...
)
// printWidth = dots - left - right (atau dots -2*left jika autoCenter)
2) Tidak ada rightMargin — tidak bisa atur margin kanan independen
Lokasi: PrinterConfig (PrinterModels.kt) & ESCPosCommandBuilder
Masalah: Hanya leftMargin. User yang butuh margin kanan saja (atau kiri≠kanan) tidak bisa. autoCenter meniru kanan = kiri, bukan solusi.
Usulan: Tambah rightMargin: Int = 0 di PrinterConfig & PrinterProfile, hitung printWidth = dots - left - right (atau dots -2*left bila autoCenter). UI app sudah siap preset, tinggal kirim rightMargin.
3) paperWidthDots == 0 fallback heuristik (paperWidth -10)*8 tidak akurat untuk printer 58/80 tertentu
Lokasi: fromPrinterConfig baris dots = if (paperWidthDots>0) ... else ((paperWidth -10)*8)
Masalah: Beberapa thermal printer 58mm = 372/384 dots, 80mm = 576/640 dots tergantung DPI (203 vs 180). Heuristik -10 bisa salah 10–20 dots → centering melenceng.
Usulan: Jika paperWidthDots == 0, fallback berdasarkan characterPerLine & paperWidth yang lebih presisi, atau wajibkan paperWidthDots di preset (app sudah lakukan via PaperPreset). Documentasikan agar paperWidthDots wajib diisi.
4) leftMargin + autoCenter centeringPadding bisa off-by-one untuk karakter ganjil
Lokasi: centeringPadding = ((printWidth - actualTextWidth)/2).toInt()
Masalah: Integer truncation bisa 1 dot miring kiri.
Usulan: Pakai roundToInt() atau distribusikan sisa 1 dot ke kanan via ESC/POS GS L + ESC $.
Reproduksi untuk maintainer
PrinterConfig(name="Test", connectionType=NETWORK, address="192.168.1.100", paperWidth=58, paperWidthDots=384, characterPerLine=32, leftMargin=20, autoCenter=false)
val builder = ESCPosCommandBuilder.fromPrinterConfig(config); builder.line("12345678901234567890123456789012")
- Print ke 58mm → sisi kanan terpotong 20 dots (2 karakter hilang).
- Aktifkan
autoCenter=true dengan margin sama → tidak terpotong tapi kiri-kanan simetris.
Workaround app saat ini: PrinterFormComponents.kt tampilkan warning & sarankan 0–4 dots (58mm) / 0–8 (80mm) atau aktifkan Auto Center.
Info
- Library:
io.github.ringga-dev:kmp_printer:2.3.5 (kmp_printer-2.3.5-sources.jar)
- File terkait:
PrinterModels.kt, ESCPosCommandBuilder.kt, ESCPosConfig.kt, PrinterProfile.kt
- Dilaporkan oleh: Tim Diggo POS KMP — 31 Aug 2026 — branch
dev-split-payment
- Kontak repro:
shared/.../printer/ui/form/PrinterFormComponents.kt live helper calculation
Mohon fix #1 diutamakan (1 baris patch), karena langsung memblokir setting margin kiri di produksi.
Isu yang Perlu Diperbaiki di Library Printer —
io.github.ringga-dev:kmp_printer:2.3.51)
leftMargintanpaautoCentermenyebabkan kanan terpotong / overflowLokasi library:
commonMain/ngga/ring/printer/util/escpos/ESCPosCommandBuilder.kt:fromPrinterConfig(lihat decompile di sumberkmp_printer-2.3.5-sources.jar)Kode saat ini (ringkas):
Masalah:
autoCenter==false→printWidth = dots(misal 384),paperWidthDots = dots(384),leftMargin = 20. Total lebar yang dipakai =leftMargin (20) + actualTextWidth (384) = 404 > dots (384)→ melebihi lebar fisik kertas → sisi kanan terpotong / wrap. User set kiri 20, kanan ikut kena.autoCenter==true→printWidth = dots - 2*left, jadi margin simetris kiri & kanan, tidak overflow tapi printable mengecil di kedua sisi.Yang diharapkan:
leftMarginseharusnya offset murni tanpa mengorbankan kanan melebihi kertas: lebar printable =dots - leftMargin(kanan tetap di tepi kertas). Jika user set kiri 20 pada 384 dots, printable harus 364 dots (~30 char pada 32cpl).autoCenterseharusnya opsional untuk centering, bukan satu-satunya cara agar tidak overflow.Dampak di app:
User Diggo POS bingung: set kiri 10 kanan jadi sempit/terpotong. Workaround app saat ini hanya tampil warning & sarankan
autoCenter=trueatauleft 0–4/0–8.Usulan fix di library (patch
fromPrinterConfig):Dengan ini
OFF + left=20→printWidth=364,effectiveChars≈30(bukan 32),actualTextWidth≈364,leftMargin=20→ total 384 pas, tidak terpotong.ONtetap simetris.Alternatif lebih lengkap: tambah field
rightMargindiPrinterConfigagar kiri/kanan bisa diatur independen, bukan hanyaleftdenganautoCentermirroring.2) Tidak ada
rightMargin— tidak bisa atur margin kanan independenLokasi:
PrinterConfig(PrinterModels.kt) &ESCPosCommandBuilderMasalah: Hanya
leftMargin. User yang butuh margin kanan saja (atau kiri≠kanan) tidak bisa.autoCentermeniru kanan = kiri, bukan solusi.Usulan: Tambah
rightMargin: Int = 0diPrinterConfig&PrinterProfile, hitungprintWidth = dots - left - right(ataudots -2*leftbilaautoCenter). UI app sudah siap preset, tinggal kirimrightMargin.3)
paperWidthDots == 0fallback heuristik(paperWidth -10)*8tidak akurat untuk printer 58/80 tertentuLokasi:
fromPrinterConfigbarisdots = if (paperWidthDots>0) ... else ((paperWidth -10)*8)Masalah: Beberapa thermal printer 58mm = 372/384 dots, 80mm = 576/640 dots tergantung DPI (203 vs 180). Heuristik
-10bisa salah 10–20 dots → centering melenceng.Usulan: Jika
paperWidthDots == 0, fallback berdasarkancharacterPerLine&paperWidthyang lebih presisi, atau wajibkanpaperWidthDotsdi preset (app sudah lakukan viaPaperPreset). Documentasikan agarpaperWidthDotswajib diisi.4)
leftMargin+autoCentercenteringPadding bisa off-by-one untuk karakter ganjilLokasi:
centeringPadding = ((printWidth - actualTextWidth)/2).toInt()Masalah: Integer truncation bisa 1 dot miring kiri.
Usulan: Pakai
roundToInt()atau distribusikan sisa 1 dot ke kanan via ESC/POSGS L+ESC $.Reproduksi untuk maintainer
PrinterConfig(name="Test", connectionType=NETWORK, address="192.168.1.100", paperWidth=58, paperWidthDots=384, characterPerLine=32, leftMargin=20, autoCenter=false)val builder = ESCPosCommandBuilder.fromPrinterConfig(config); builder.line("12345678901234567890123456789012")autoCenter=truedengan margin sama → tidak terpotong tapi kiri-kanan simetris.Workaround app saat ini:
PrinterFormComponents.kttampilkan warning & sarankan0–4 dots (58mm) / 0–8 (80mm)atau aktifkan Auto Center.Info
io.github.ringga-dev:kmp_printer:2.3.5(kmp_printer-2.3.5-sources.jar)PrinterModels.kt,ESCPosCommandBuilder.kt,ESCPosConfig.kt,PrinterProfile.ktdev-split-paymentshared/.../printer/ui/form/PrinterFormComponents.ktlive helper calculation