Contexto:
Tengo una impresora térmica EOS, pero no imprime correctamente los caracteres árabes como en esta imagen a continuación:
Como puede ver, el texto en árabe se imprime incorrectamente y de izquierda a derecha (LTR), (debería ser de derecha a izquierda - RTL).
Nota : Puede ver claramente que el texto en inglés se imprime perfectamente al final de la página.
Pregunta:
¿Cómo puedo imprimir texto en árabe de la manera correcta en flutter?
Información adicional:
Versión Flutter: 2.5.3 (Estable)
Paquete utilizado: escpos
Probado en varios dispositivos Android con la versión de Android (8, 9, 10)
primero he usado el paquete esc_pos y no funcionó. Al final, utilicé el paquete de impresión para imprimir una factura en árabe y funciona bien, y la explicación a continuación
Este es el código completo para usar el paquete de impresión. primero, cree una clase para pasarle los parámetros (los parámetros que necesita imprimir) en mi caso, 4 param requerido.
class HtmlGeneratorParamsAccount { final String daybet, payable, balance; final List<AccountStatmentModel> list; HtmlGeneratorParamsAccount({ required this.daybet, required this.payable, required this.balance, required this.list, }); } String generateHtmlA(HtmlGeneratorParamsAccount p) { String items = ''' '''; for (var i = 0; i < p.list.length; i++) { DateFormat datee = DateFormat('yyyy/MM/dd', 'en'); DateTime forFormat = p.list[i].date; final String formatted = datee.format(forFormat); double amount = p.list[i].debitAmount + p.list[i].payableAmount; items += '''<tr class = "item">'''; items += '''<td>${p.list[i].description}</td>'''; items += '''<td>${formatted}</td>'''; items += '''<td>${p.list[i].opName}</td>'''; items += '''<td>${double.parse(amount.toStringAsFixed(1))}</td>'''; items += '''</tr>'''; } var pay = double.parse(p.payable).toStringAsFixed(1); var day = double.parse(p.daybet).toStringAsFixed(1); var html = """entonces necesita usar HTML para construir el cuerpo de su factura (forma)
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href= "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" /> <style> .invoice-box { max-width:1000px; margin: auto; padding: 8px; border: 1px solid #eee; box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); font-size: 8px; line-height: 24px; font-family: 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif; color: #555; } .invoice-box table { width: 100%; line-height: inherit; text-align: center; } .invoice-box table td { padding: 10px; vertical-align: top; } .invoice-box table tr.top table td { padding-bottom: 5px; } * { box-sizing: border-box; } .column { float: right; width:23%; padding: 16px; } .header{ text-align:center; } .row:after { content: ""; display: table; clear: both; } </style> </head> <body> <h2 class="header">كشف حساب</h2> <h3 class="header">بيانات الزبون</h3> <table> <tr> <div class="row"> <div class="column" > <h4>المبلغ</h4> <p></p> </div> <div class="column" > <h4>نوع العملية</h4> </div> <div class="column" > <h4>تاريخ</h4> </div> <div class="column" > <h4>وصف</h4> </div> </div> </tr> $items </table> <div> <p class="header">------------------------</p> <p class="header">:مجموع ${day}</p> <p class="header">:مجموع $pay</p> <p class="header">:المبلغ ${p.balance}</p> <p>---</p> <p>--</p> <p>-</p> </div> </body> </html>"""; return html; '''crear una función
cuando necesite usarlo (en el botón, por ejemplo)
printDoc(HtmlGeneratorParamsAccount params) asíncrono {
await Printing.layoutPdf( onLayout: (format) async => await Printing.convertHtml( format: format, html: generateHtmlA(params), ), );} ahora usaremos la función printDoc dentro de IconButton
los parámetros son la clase que creamos al principio, y pasaremos los parámetros requeridos
IconButton( onPressed: () { HtmlGeneratorParamsAccount params= HtmlGeneratorParamsAccount( list: list, payable: payableAmount.toString(), daybet: debitTxt.toString(), balance: balance.toString(), ); printDoc(params); }, icon: Icon( Icons.print, )),