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

ِِA*_*lak 8 html printing dart flutter

语境:

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

阿拉伯语编码不正确

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

注意:您可以清楚地看到英文文本完美打印在页面末尾。

问题:

如何在 flutter 中以正确的方式打印阿拉伯文本?

附加信息:

颤振版本:2.5.3(稳定)

使用的软件包:escpos

在运行 Android 版本(8、9、10)的多个 Android 设备上进行了测试

ِِA*_*lak 5

首先我使用了 esc_pos 包,但它不起作用。\n最后,我使用打印包打印阿拉伯发票,它工作正常,下面的解释

\n
\n

这是使用打印包的完整代码。\n首先,创建一个类来将参数传递给它(您需要打印的参数),在我的案例 4 中需要参数。

\n
\n
class HtmlGeneratorParamsAccount {\n  final String daybet, payable, balance;\n  final List<AccountStatmentModel> list;\n\n  HtmlGeneratorParamsAccount({\n    required this.daybet,\n    required this.payable,\n    required this.balance,\n    required this.list,\n  });\n}\n\nString generateHtmlA(HtmlGeneratorParamsAccount p) {\n  String items = '''\n    ''';\n\n  for (var i = 0; i < p.list.length; i++) {\n    DateFormat datee = DateFormat('yyyy/MM/dd', 'en');\n    DateTime forFormat = p.list[i].date;\n    final String formatted = datee.format(forFormat);\n    double amount = p.list[i].debitAmount + p.list[i].payableAmount;\n    items += '''<tr class = "item">''';\n\n    items += '''<td>${p.list[i].description}</td>''';\n    items += '''<td>${formatted}</td>''';\n    items += '''<td>${p.list[i].opName}</td>''';\n    items += '''<td>${double.parse(amount.toStringAsFixed(1))}</td>''';\n    items += '''</tr>''';\n  }\n  var pay = double.parse(p.payable).toStringAsFixed(1);\n  var day = double.parse(p.daybet).toStringAsFixed(1);\n  var html = """ \n
Run Code Online (Sandbox Code Playgroud)\n
\n

那么您需要使用 HTML 来构建发票正文(形状)

\n
\n
    <!DOCTYPE html>\n<html>\n<head>\n<meta name="viewport" content="width=device-width, initial-scale=1">\n<link rel="stylesheet" href=\n"https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />\n    <style>\n\n      .invoice-box {\n        max-width:1000px;\n        margin: auto;\n        padding: 8px;\n        border: 1px solid #eee;\n        box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);\n        font-size: 8px;\n        line-height: 24px;\n        font-family: 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;\n        color: #555;\n      }\n        .invoice-box table {\n        width: 100%;\n        line-height: inherit;\n        text-align: center;\n      }\n\n      .invoice-box table td {\n        padding: 10px;\n        vertical-align: top;\n      }\n \n      .invoice-box table tr.top table td {\n        padding-bottom: 5px;\n      }\n\n* {\n  box-sizing: border-box;\n}\n\n\n.column {\n  float: right;\n  width:23%;\n  \n  padding: 16px;\n \n}\n.header{\ntext-align:center;\n}\n\n\n.row:after {\n  content: "";\n  display: table;\n  clear: both;\n}\n \n</style>\n</head>\n<body>\n<h2 class="header">\xd9\x83\xd8\xb4\xd9\x81 \xd8\xad\xd8\xb3\xd8\xa7\xd8\xa8</h2>\n<h3 class="header">\xd8\xa8\xd9\x8a\xd8\xa7\xd9\x86\xd8\xa7\xd8\xaa \xd8\xa7\xd9\x84\xd8\xb2\xd8\xa8\xd9\x88\xd9\x86</h3>\n<table>\n<tr>\n<div class="row">\n  <div class="column" >\n    <h4>\xd8\xa7\xd9\x84\xd9\x85\xd8\xa8\xd9\x84\xd8\xba</h4>\n    <p></p>\n  </div>\n \n  <div class="column" >\n\n    <h4>\xd9\x86\xd9\x88\xd8\xb9 \xd8\xa7\xd9\x84\xd8\xb9\xd9\x85\xd9\x84\xd9\x8a\xd8\xa9</h4>\n    \n  </div>\n\n  <div class="column" >\n    <h4>\xd8\xaa\xd8\xa7\xd8\xb1\xd9\x8a\xd8\xae</h4>\n   \n  </div>\n  <div class="column" >\n    <h4>\xd9\x88\xd8\xb5\xd9\x81</h4>\n    \n  </div>\n</div>\n</tr>\n$items\n</table>\n<div>\n<p class="header">------------------------</p>\n<p class="header">:\xd9\x85\xd8\xac\xd9\x85\xd9\x88\xd8\xb9 ${day}</p>\n<p class="header">:\xd9\x85\xd8\xac\xd9\x85\xd9\x88\xd8\xb9 $pay</p>\n<p class="header">:\xd8\xa7\xd9\x84\xd9\x85\xd8\xa8\xd9\x84\xd8\xba ${p.balance}</p>\n<p>---</p>\n<p>--</p>\n<p>-</p>\n</div>\n</body>\n</html>""";\n  return html;\n\n'''\n
Run Code Online (Sandbox Code Playgroud)\n

创建一个函数

\n
\n

当你需要使用它时(例如在按钮中)

\n
\n

printDoc(HtmlGeneratorParamsAccount params) 异步 {

\n
await Printing.layoutPdf(\n  onLayout: (format) async => await Printing.convertHtml(\n    format: format,\n    html: generateHtmlA(params),\n  ),\n);\n
Run Code Online (Sandbox Code Playgroud)\n

}\n现在我们将在 IconButton 中使用 printDoc 函数

\n
\n

params是我们一开始制作的类,我们将传递所需的参数

\n
\n
 IconButton(\n          onPressed: () {\n            HtmlGeneratorParamsAccount params=\n                HtmlGeneratorParamsAccount(\n              list: list,\n              payable: payableAmount.toString(),\n              daybet: debitTxt.toString(),\n              balance: balance.toString(),\n            );\n            printDoc(params);\n          },\n          icon: Icon(\n            Icons.print,\n          )),\n
Run Code Online (Sandbox Code Playgroud)\n