Flutter热敏打印机控制插件esc_pos_plus的使用

Flutter热敏打印机控制插件esc_pos_plus的使用

esc_pos_plus

Pub Version

esc_pos_plus 是一个基于 Flutter/Dart 的类库,用于生成 ESC/POS 命令,这些命令可以发送到热敏打印机。

这个库主要用于:

  • 连接到 Wi-Fi/以太网打印机
  • 使用 text 方法进行简单的文本打印
  • 使用 row 方法打印表格
  • 文本样式:
    • 大小、对齐、加粗、反向、下划线、不同字体、旋转90°
  • 打印图像
  • 打印条形码(UPC-A、UPC-E、JAN13、JAN8、CODE39、ITF、CODABAR、CODE128)
  • 纸张切割(部分、全部)
  • 发出蜂鸣声(不同持续时间)
  • 纸张进纸、退纸

注意:您的打印机可能不支持上述所有功能(某些样式、部分/全部纸张切割、退纸、条形码等)。

生成票据

简单票据与样式

List<int> testTicket() {
  final List<int> bytes = [];
  // 使用默认配置文件
  final profile = await CapabilityProfile.load();
  final generator = Generator(PaperSize.mm80, profile);
  
  bytes += generator.text(
      'Regular: aA bB cC dD eE fF gG hH iI jJ kK lL mM nN oO pP qQ rR sS tT uU vV wW xX yY zZ');
  bytes += generator.text('Special 1: àÀ èÈ éÉ ûÛ üÜ çÇ ôÔ',
      styles: PosStyles(codeTable: PosCodeTable.westEur));
  bytes += generator.text('Special 2: blåbærgrød',
      styles: PosStyles(codeTable: PosCodeTable.westEur));

  bytes += generator.text('Bold text', styles: PosStyles(bold: true));
  bytes += generator.text('Reverse text', styles: PosStyles(reverse: true));
  bytes += generator.text('Underlined text',
      styles: PosStyles(underline: true), linesAfter: 1);
  bytes += generator.text('Align left', styles: PosStyles(align: PosAlign.left));
  bytes += generator.text('Align center', styles: PosStyles(align: PosAlign.center));
  bytes += generator.text('Align right',
      styles: PosStyles(align: PosAlign.right), linesAfter: 1);

  bytes += generator.text('Text size 200%',
      styles: PosStyles(
        height: PosTextSize.size2,
        width: PosTextSize.size2,
      ));

  bytes += generator.feed(2);
  bytes += generator.cut();
  return bytes;
}

打印表格行

generator.row([
    PosColumn(
      text: 'col3',
      width: 3,
      styles: PosStyles(align: PosAlign.center, underline: true),
    ),
    PosColumn(
      text: 'col6',
      width: 6,
      styles: PosStyles(align: PosAlign.center, underline: true),
    ),
    PosColumn(
      text: 'col3',
      width: 3,
      styles: PosStyles(align: PosAlign.center, underline: true),
    ),
]);

打印图像

此包实现了三种 ESC/POS 函数:

  • ESC * - 按列格式打印
  • GS v 0 - 位图格式打印(已过时)
  • GS ( L - 位图格式打印

请注意,您的打印机可能只支持其中的一些函数。

import 'dart:io';
import 'package:image/image.dart';

final ByteData data = await rootBundle.load('assets/logo.png');
final Uint8List bytes = data.buffer.asUint8List();
final Image image = decodeImage(bytes);
// 使用 `ESC *`
generator.image(image);
// 使用 `GS v 0` (已过时)
generator.imageRaster(image);
// 使用 `GS ( L`
generator.imageRaster(image, imageFn: PosImageFn.graphics);

打印条形码

final List<int> barData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 4];
generator.barcode(Barcode.upcA(barData));

打印二维码

使用原生 ESC/POS 命令:

generator.qrcode('example.com');

如果您的打印机不支持原生命令,可以通过以下方式添加二维码作为图像:

pubspec.yaml 文件中添加 qr_flutterpath_provider 依赖项:

dependencies:
  qr_flutter: ^4.0.0
  path_provider: ^2.0.0

然后在 Dart 代码中:

String qrData = "google.com";
const double qrSize = 200;
try {
  final uiImg = await QrPainter(
    data: qrData,
    version: QrVersions.auto,
    gapless: false,
  ).toImageData(qrSize);
  final dir = await getTemporaryDirectory();
  final pathName = '${dir.path}/qr_tmp.png';
  final qrFile = File(pathName);
  final imgFile = await qrFile.writeAsBytes(uiImg.buffer.asUint8List());
  final img = decodeImage(imgFile.readAsBytesSync());

  generator.image(img);
} catch (e) {
  print(e);
}

使用代码表

不同的打印机支持不同的代码表集。一些打印机型号已在 CapabilityProfile 类中定义。因此,如果您想更改默认代码表,选择正确的配置文件非常重要:

// Xprinter XP-N160I
final profile = await CapabilityProfile.load('XP-N160I');
final generator = Generator(PaperSize.mm80, profile);
bytes += generator.setGlobalCodeTable('CP1252');

可以通过以下方式获取所有可用配置文件:

final profiles = await CapabilityProfile.getAvailableProfiles();

更多关于Flutter热敏打印机控制插件esc_pos_plus的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter热敏打印机控制插件esc_pos_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


esc_pos_plus 是一个用于 Flutter 的热敏打印机控制插件,它支持 ESC/POS 协议,适用于多种热敏打印机。通过这个插件,你可以轻松地在 Flutter 应用中生成打印任务并发送到热敏打印机。

以下是如何使用 esc_pos_plus 插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 esc_pos_plus 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  esc_pos_plus: ^1.0.0

然后运行 flutter pub get 来安装依赖。

2. 导入插件

在你的 Dart 文件中导入 esc_pos_plus 插件:

import 'package:esc_pos_plus/esc_pos_utils.dart';
import 'package:esc_pos_plus/printer.dart';

3. 创建打印任务

你可以使用 Generator 类来生成 ESC/POS 命令,并将这些命令发送到打印机。

Future<void> printReceipt() async {
  final profile = await CapabilityProfile.load();
  final generator = Generator(PaperSize.mm80, profile);

  List<int> bytes = [];

  // 添加文本
  bytes += generator.text('Hello, World!', styles: PosStyles(bold: true));

  // 添加换行
  bytes += generator.feed(2);

  // 添加二维码
  bytes += generator.qrcode('https://example.com');

  // 添加切割命令
  bytes += generator.cut();

  // 连接到打印机并发送打印任务
  final PrinterNetworkManager printerManager = PrinterNetworkManager();
  printerManager.selectPrinter('192.168.1.100', port: 9100);

  final result = await printerManager.printTicket(bytes);

  if (result == PosPrintResult.success) {
    print('Print success');
  } else {
    print('Print failed: $result');
  }
}

4. 连接打印机

esc_pos_plus 支持通过网络、蓝牙或 USB 连接打印机。你可以使用 PrinterNetworkManagerPrinterBluetoothManagerPrinterUsbManager 来管理打印机连接。

网络打印机

final PrinterNetworkManager printerManager = PrinterNetworkManager();
printerManager.selectPrinter('192.168.1.100', port: 9100);

蓝牙打印机

final PrinterBluetoothManager printerManager = PrinterBluetoothManager();
printerManager.selectPrinter(bluetoothDevice);

USB打印机

final PrinterUsbManager printerManager = PrinterUsbManager();
printerManager.selectPrinter(usbDevice);

5. 发送打印任务

使用 printTicket 方法将生成的 ESC/POS 命令发送到打印机:

final result = await printerManager.printTicket(bytes);

if (result == PosPrintResult.success) {
  print('Print success');
} else {
  print('Print failed: $result');
}
回到顶部