Flutter打印小票插件esc_pos_utils_appzap的使用

esc_pos_utils_appzap

Pub Version

esc_pos_utils_appzap 是一个用于生成 ESC/POS 打印命令的基础库。Generator 类可以生成 ESC/POS 命令,并将其发送到热敏打印机。

此库被用作以下项目的底层支持:

主要功能

  • 连接到 Wi-Fi/以太网打印机
  • 使用 text 方法进行简单文本打印
  • 使用 row 方法打印表格
  • 文本样式:
    • 大小、对齐方式、加粗、反向、下划线、不同字体、旋转 90°
  • 打印图像
  • 打印条形码(支持 UPC-A, UPC-E, JAN13 (EAN13), JAN8 (EAN8), 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 函数:

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

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

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 文件中添加依赖项:

dependencies:
  qr_flutter: ^4.0.0
  path_provider: ^2.0.9

代码示例:

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();

如何帮助

  • 添加 CapabilityProfile 以支持您的打印机型号。新的配置文件应添加到 lib/resources/capabilities.json 文件中。
  • 测试您的打印机并在表格中添加它:
  • 测试并报告错误
  • 分享您对改进的看法(代码优化、新功能等)

完整示例代码

import 'package:esc_pos_utils_appzap/esc_pos_utils_appzap.dart';
import 'package:image/image.dart';
import 'dart:typed_data';
import 'package:flutter/services.dart';

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: 'CP1252'));
  bytes += generator.text('Special 2: blåbærgrød',
      styles: PosStyles(codeTable: 'CP1252'));

  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.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),
    ),
  ]);

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

  // 打印图像
  final ByteData data = await rootBundle.load('assets/logo.png');
  final Uint8List imgBytes = data.buffer.asUint8List();
  final Image image = 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));

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

更多关于Flutter打印小票插件esc_pos_utils_appzap的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter打印小票插件esc_pos_utils_appzap的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


esc_pos_utils 是一个用于生成 ESC/POS 命令的 Flutter 插件,通常用于打印小票。它可以帮助你生成适用于热敏打印机的命令,并将这些命令发送到打印机进行打印。esc_pos_utils_appzapesc_pos_utils 的一个扩展或变体,可能包含一些额外的功能或优化。

以下是如何在 Flutter 项目中使用 esc_pos_utils 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 esc_pos_utils 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  esc_pos_utils: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入包

在你的 Dart 文件中导入 esc_pos_utils 包:

import 'package:esc_pos_utils/esc_pos_utils.dart';

3. 生成 ESC/POS 命令

你可以使用 Generator 类来生成 ESC/POS 命令。以下是一个简单的示例:

void printReceipt() {
  // 创建一个 Generator 实例
  final generator = Generator(PaperSize.mm80, await CapabilityProfile.load());

  // 生成小票内容
  List<int> bytes = [];
  bytes += generator.reset();
  bytes += generator.text('Hello, World!');
  bytes += generator.text('This is a test receipt.',
      styles: PosStyles(align: PosAlign.center));
  bytes += generator.text('Thank you!',
      styles: PosStyles(bold: true, align: PosAlign.center));
  bytes += generator.cut();

  // 将生成的命令发送到打印机
  // 这里需要根据你的打印机类型和连接方式来实现
  // 例如,使用蓝牙、Wi-Fi 或 USB 连接打印机
  // 以下是一个伪代码示例:
  // printerConnection.send(bytes);
}

4. 连接打印机

esc_pos_utils 只负责生成 ESC/POS 命令,你需要使用其他插件或方法来连接打印机并发送这些命令。常见的连接方式包括:

  • 蓝牙: 使用 flutter_blueflutter_reactive_ble 插件。
  • Wi-Fi: 使用 httpdio 插件通过 TCP/IP 连接打印机。
  • USB: 使用 flutter_usb_printer 插件。

5. 发送打印命令

根据你选择的连接方式,将生成的 bytes 发送到打印机。以下是一个使用蓝牙连接的示例:

import 'package:flutter_blue/flutter_blue.dart';

void sendToPrinter(List<int> bytes) async {
  FlutterBlue flutterBlue = FlutterBlue.instance;

  // 扫描并连接打印机
  // 这里假设你已经知道打印机的蓝牙地址
  BluetoothDevice printer = await flutterBlue.connect(BluetoothDevice(
    id: DeviceIdentifier('XX:XX:XX:XX:XX:XX'),
    name: 'Printer',
    type: BluetoothDeviceType.unknown,
  ));

  // 找到打印服务
  List<BluetoothService> services = await printer.discoverServices();
  BluetoothService service = services.firstWhere(
    (s) => s.uuid.toString() == '00001101-0000-1000-8000-00805f9b34fb',
  );

  // 找到打印特征
  BluetoothCharacteristic characteristic = service.characteristics.firstWhere(
    (c) => c.uuid.toString() == '00002a00-0000-1000-8000-00805f9b34fb',
  );

  // 发送打印命令
  await characteristic.write(bytes);
}
回到顶部