EOS热敏打印机在使用Flutter框架时无法正确打印阿拉伯字符

xwmevbvl  于 2022-12-27  发布在  Flutter
关注(0)|答案(3)|浏览(209)
    • 背景:**

我有一个EOS热敏打印机,但它不能正确打印阿拉伯字符,如下图所示:

正如您所看到的,阿拉伯语文本打印不正确,从左到右(LTR),(它应该是从右到左-RTL)。

  • 注 *:您可以清楚地看到英文文本在页面末尾打印得非常完美。
    • 问题:**

如何在flutter中正确打印阿拉伯语文本?

    • 其他信息:**

扑动版本:2.5.3(稳定)
所用 Package :escpos
在运行Android版本(8、9、10)的多台Android设备上进行测试

mv1qrgav

mv1qrgav1#

我先用了esc_pos包,不起作用,最后用 *printing包 * 打印了一张阿拉伯文发票,效果很好,解释如下
这是使用打印包的完整代码。首先,创建一个类,将参数传递给它(您需要打印的参数)在我的case 4 required param中。

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 = """

然后,您需要使用HTML来构建发票的主体(形状)

<!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;

'''

创建函数
当你需要使用它(例如在按钮中)
printDoc(HtmlGeneratorParams帐户参数)异步{

await Printing.layoutPdf(
  onLayout: (format) async => await Printing.convertHtml(
    format: format,
    html: generateHtmlA(params),
  ),
);

}现在我们将使用IconButton中的printDoc函数
params是我们在开始时创建的类,我们将传递所需的参数

IconButton(
          onPressed: () {
            HtmlGeneratorParamsAccount params=
                HtmlGeneratorParamsAccount(
              list: list,
              payable: payableAmount.toString(),
              daybet: debitTxt.toString(),
              balance: balance.toString(),
            );
            printDoc(params);
          },
          icon: Icon(
            Icons.print,
          )),
9rygscc1

9rygscc12#

你可以查一下
这个回收站用了3张支票
secreenshot转换小部件到图像和图像库转换到uint8和pos pront打印它,因为你爱显示
您可以从here检查它

w6lpcovy

w6lpcovy3#

如果EOS热敏打印机在使用Flutter框架时无法正确打印阿拉伯字符,您可以尝试:

  • 在样式组件上添加验证/检查:

编码:blue_print_pos

receiptText.addText(
 '${invoiceCard.name}',
 alignment: defaultEnLang ? ReceiptAlignment.left : ReceiptAlignment.right,
);


代码:esc_pos_utils

bytes += ticket.textEncoded(
 encodedCode,
 styles: PosStyles(
   align: defaultEnLang ? PosAlign.left : PosAlign.right,
   bold: true,
 ),
);

这里defaultEnLang保存布尔值,它是使用当前语言获取的。

相关问题