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

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

插件简介

esc_pos_utils_refactor 是一个用于生成 ESC/POS 打印命令的 Flutter/Dart 库。它提供了通用的类来生成可以发送到热敏打印机的 ESC/POS 命令。

该库是以下两个库的基础:

  • esc_pos_printer: 用于通过 Wi-Fi 或以太网打印。
  • esc_pos_bluetooth: 用于通过蓝牙打印。

主要特性

  • 支持连接 Wi-Fi/以太网打印机。
  • 简单的文本打印功能。
  • 支持表格打印。
  • 文本样式支持(如大小、对齐方式、加粗、反转、下划线等)。
  • 支持打印图像。
  • 支持打印条形码(包括 UPC-A、UPC-E、JAN13、JAN8、CODE39、ITF、CODABAR、CODE128)。
  • 支持纸张切割(部分切割和完全切割)。
  • 支持蜂鸣器功能。
  • 支持纸张进纸和反向进纸。

注意:您的打印机可能不支持所有列出的功能。


示例代码

以下是一个完整的示例代码,展示了如何使用 esc_pos_utils_refactor 插件生成打印任务。

依赖配置

pubspec.yaml 文件中添加以下依赖:

dependencies:
  esc_pos_utils_refactor: ^1.0.0

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

示例代码

import 'dart:typed_data';
import 'package:flutter/services.dart';
import 'package:esc_pos_utils_refactor/esc_pos_utils_refactor.dart';
import 'package:image/image.dart' as img;

Future<void> main() async {
  // 加载默认配置文件
  final profile = await CapabilityProfile.load();
  final generator = Generator(PaperSize.mm80, profile);

  List<int> bytes = [];

  // 打印普通文本
  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,
  );

  // 设置文本大小为 200%
  bytes += generator.text(
    'Text size 200%',
    styles: PosStyles(
      height: PosTextSize.size2,
      width: PosTextSize.size2,
    ),
  );

  // 打印表格行
  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),
    ),
  ]);

  // 打印图像
  final ByteData data = await rootBundle.load('assets/logo.png');
  final Uint8List imgBytes = data.buffer.asUint8List();
  final img.Image image = img.decodeImage(imgBytes)!;
  bytes += generator.image(image);

  // 打印条形码
  final List<int> barData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 4];
  bytes += generator.barcode(Barcode.upcA(barData));

  // 打印二维码
  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.Image qrImage = img.decodeImage(imgFile.readAsBytesSync())!;
    bytes += generator.image(qrImage);
  } catch (e) {
    print(e);
  }

  // 进纸并切纸
  bytes += generator.feed(2);
  bytes += generator.cut();

  // 打印完成
  print(bytes);
}

功能详解

1. 打印文本

通过 generator.text() 方法可以打印普通文本,并支持多种样式,例如加粗、反转、下划线、对齐方式等。

bytes += generator.text(
  'Hello World',
  styles: PosStyles(bold: true, underline: true),
  linesAfter: 2,
);

2. 打印表格

通过 generator.row() 方法可以打印表格行,每个单元格可以设置宽度和样式。

bytes += generator.row([
  PosColumn(text: 'Header1', width: 4),
  PosColumn(text: 'Header2', width: 4),
  PosColumn(text: 'Header3', width: 4),
]);

3. 打印图像

支持三种打印图像的方式:

  • 使用 ESC * 命令(推荐)
  • 使用 GS v 0 命令(已过时)
  • 使用 GS ( L 命令
final ByteData data = await rootBundle.load('assets/logo.png');
final Uint8List imgBytes = data.buffer.asUint8List();
final img.Image image = img.decodeImage(imgBytes)!;
bytes += generator.image(image);

4. 打印条形码

支持多种条形码类型,例如 UPC-A、UPC-E、JAN13 等。

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

5. 打印二维码

可以通过 ESC/POS 原生命令或将其转换为图像后打印。

原生命令

generator.qrcode('example.com');

转换为图像

final uiImg = await QrPainter(data: 'google.com').toImageData(200);
final img.Image qrImage = img.decodeImage(uiImg!.buffer.asUint8List())!;
bytes += generator.image(qrImage);

使用打印机配置文件

不同的打印机支持不同的代码表。可以通过 CapabilityProfile 类加载打印机配置文件。

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_utils_refactor的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


esc_pos_utils_refactor 是一个用于在 Flutter 应用中生成 ESC/POS 命令的库,主要用于控制热敏打印机。它可以帮助你生成打印命令,以便通过蓝牙、Wi-Fi 或 USB 连接到热敏打印机并执行打印任务。

以下是如何在 Flutter 项目中使用 esc_pos_utils_refactor 的步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  esc_pos_utils_refactor: ^1.0.0  # 请查看最新版本

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

2. 创建打印任务

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

import 'package:esc_pos_utils_refactor/esc_pos_utils_refactor.dart';

void printReceipt() {
  // 创建一个生成器实例
  final generator = Generator(PaperSize.mm80, PosFontType.fontA);

  // 生成打印命令
  List<int> bytes = [];
  
  bytes += generator.reset();
  bytes += generator.text('Hello, World!', styles: PosStyles(bold: true));
  bytes += generator.text('This is a test receipt.');
  bytes += generator.feed(2);
  bytes += generator.cut();

  // 这里你可以将 bytes 发送到打印机
  // 例如通过蓝牙、Wi-Fi 或 USB 连接
  sendToPrinter(bytes);
}

void sendToPrinter(List<int> bytes) {
  // 这里实现将 bytes 发送到打印机的逻辑
  // 例如使用蓝牙库 (如 flutter_blue) 或网络库 (如 http) 来发送数据
}

3. 连接到打印机

esc_pos_utils_refactor 只负责生成 ESC/POS 命令,你需要使用其他库来连接到打印机并发送这些命令。

蓝牙打印机

如果你使用的是蓝牙打印机,可以使用 flutter_blue 库来连接和发送数据。

import 'package:flutter_blue/flutter_blue.dart';

void connectAndPrint() async {
  FlutterBlue flutterBlue = FlutterBlue.instance;

  // 扫描设备
  flutterBlue.startScan(timeout: Duration(seconds: 4));

  // 监听扫描结果
  flutterBlue.scanResults.listen((results) {
    for (ScanResult result in results) {
      if (result.device.name == 'Your Printer Name') {
        // 停止扫描
        flutterBlue.stopScan();

        // 连接设备
        result.device.connect();

        // 发现服务
        result.device.discoverServices().then((services) {
          for (BluetoothService service in services) {
            if (service.uuid.toString() == 'your_service_uuid') {
              for (BluetoothCharacteristic characteristic in service.characteristics) {
                if (characteristic.uuid.toString() == 'your_characteristic_uuid') {
                  // 发送打印数据
                  characteristic.write(printReceipt());
                }
              }
            }
          }
        });
      }
    }
  });
}

网络打印机

如果你使用的是网络打印机,可以使用 httpsocket 库来发送数据。

import 'dart:io';

void printViaNetwork() async {
  final socket = await Socket.connect('192.168.1.100', 9100);
  socket.add(printReceipt());
  await socket.flush();
  socket.destroy();
}

4. 处理打印结果

根据打印机的响应,你可能需要处理打印成功或失败的情况。例如,你可以监听打印机的状态或错误信息。

5. 测试和调试

在实际使用中,你可能需要根据打印机的型号和配置进行一些调整。确保你了解打印机的规格和 ESC/POS 命令集,以便正确生成和发送命令。

6. 其他功能

esc_pos_utils_refactor 还支持其他功能,如打印图像、条形码、二维码等。你可以查阅官方文档或示例代码来了解更多细节。

bytes += generator.image(img); // 打印图像
bytes += generator.barcode(Barcode.upcA('123456789012')); // 打印条形码
bytes += generator.qrcode('https://example.com'); // 打印二维码
回到顶部