EscPosGenerator: API per Sviluppatori
EscPosGenerator e la classe statica in pos_core che converte una lista di PrintBlock in byte ESC/POS pronti per l'invio a stampanti termiche. Si trova nel package pos_core/lib/logic/print/escpos_generator.dart e utilizza la libreria esc_pos_utils_plus.
Metodo Principale: generateBytes
static Future<List<int>> generateBytes({
required List<PrintBlock> blocks,
required PaperSize paperSize,
required CapabilityProfile profile,
Map<String, dynamic> data = const {},
}) async
Parametri:
blocks: lista diPrintBlockche compongono il templatepaperSize: dimensione carta (PaperSize.mm58oPaperSize.mm80)profile: profilo capacita della stampante (ottenuto viaCapabilityProfile.load())data: mappa chiave-valore per l'interpolazione di variabili nel template
Ritorna: List<int> con i byte ESC/POS da inviare via socket alla stampante.
Interpolazione Variabili
I blocchi di testo supportano variabili con sintassi {{nomeVariabile}}. L'interpolazione avviene prima della generazione dei byte.
final bytes = await EscPosGenerator.generateBytes(
blocks: [
TextBlock(text: 'Ordine: {{orderId}}', bold: true, align: 'center'),
TextBlock(text: 'Cliente: {{customerName}}'),
DividerBlock(),
TextBlock(text: 'Totale: {{total}}', size: 'large', align: 'right'),
],
paperSize: PaperSize.mm80,
profile: await CapabilityProfile.load(),
data: {
'orderId': '12345',
'customerName': 'Mario Rossi',
'total': '25.50',
},
);
Tipi di PrintBlock Supportati
TextBlock
TextBlock(
text: 'Testo da stampare',
align: 'center', // 'left', 'center', 'right'
bold: true,
underline: false,
size: 'large', // 'small', 'medium', 'large'
)
Il size: 'large' raddoppia altezza e larghezza del carattere (equivalente a PosTextSize.size2).
ColumnsBlock
ColumnsBlock(columns: [
ColumnDef(text: 'Prodotto', width: 8, align: 'left'),
ColumnDef(text: '25.00', width: 4, align: 'right'),
])
Le colonne usano un sistema a 12 slot di larghezza totale. La somma dei width deve essere 12.
BarcodeBlock e QRCodeBlock
BarcodeBlock(
data: '8001234567890',
format: 'ean13', // 'ean13', 'ean8', 'code128', 'code39', 'upc_a'
height: 50,
textPosition: 'below',
)
QRCodeBlock(
data: 'https://example.com/order/123',
size: 4, // 1-8
errorCorrection: 'M', // 'L', 'M', 'Q', 'H'
)
Il metodo isValid() di BarcodeBlock verifica la lunghezza dei dati in base al formato (es. EAN-13 richiede esattamente 13 cifre numeriche).
Serializzazione JSON
Tutti i PrintBlock supportano fromJson e toJson per la persistenza nei template PrintLayout:
// Da JSON (utile per caricare template dal server)
final block = PrintBlock.fromJson({'type': 'text', 'text': 'Hello', 'bold': true});
// A JSON (utile per salvare template)
final json = block.toJson();
Il campo type nel JSON determina il tipo di blocco: text, columns, image, divider, barcode, qrcode, feed, cut.
FAQ
Come ottengo il CapabilityProfile?
Usare CapabilityProfile.load() per il profilo di default, oppure CapabilityProfile.load(name: 'XP-N160I') per un modello specifico.
Posso stampare immagini?
ImageBlock e definito nel modello ma la generazione ESC/POS per le immagini e ancora in fase di implementazione (richiede il package image per la conversione).
Come gestisco carta da 58mm vs 80mm?
Passare PaperSize.mm58 o PaperSize.mm80 a generateBytes(). Il numero di caratteri per riga cambia di conseguenza (32 vs 48 per font standard).