Flutter蓝牙打印插件esc_pos_utils_x的使用

Flutter蓝牙打印插件esc_pos_utils_x的使用

简介

esc_pos_utils_x 是一个用于生成 ESC/POS 命令的 Flutter/Dart 库。这些命令可以发送到热敏打印机进行打印。该库是 esc_pos_printeresc_pos_bluetooth 插件的基础。

特性

  • 支持连接 Wi-Fi/以太网打印机。
  • 简单的文本打印功能。
  • 表格打印功能。
  • 文本样式支持(大小、对齐方式、加粗、反白、下划线等)。
  • 支持打印图片和条形码。
  • 支持纸张切割(部分切割、全切割)、蜂鸣器控制、进纸和退纸等功能。

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

示例:生成票据

以下是一些示例代码,展示如何使用 esc_pos_utils_x 插件生成票据。

示例 1:简单的带样式的票据

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

示例 2:打印表格行

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

示例 3:打印图像

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

示例 4:打印条形码

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

示例 5:打印二维码

方法 1:使用原生 ESC/POS 命令

generator.qrcode('example.com');

方法 2:将二维码作为图像打印(如果打印机不支持原生命令)

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 文件中。
  • 测试您的打印机并将其添加到以下列表中:
  • 测试并报告问题。
  • 分享您关于改进的想法(代码优化、新功能等)。

完整示例代码

以下是完整的示例代码,展示了如何使用 esc_pos_utils_x 插件生成票据并打印。

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

Future<void> main() async {
  final profile = await CapabilityProfile.load();
  final generator = Generator(PaperSize.mm112, 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);
  // 使用替代命令打印图像(已过时)
  // bytes += generator.imageRaster(image);

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

  // 打印混合(中文+拉丁字符)文本。仅适用于支持汉字模式的打印机
  // ticket.text(
  //   'hello ! 中文字 # world @ éphémère &amp;',
  //   styles: PosStyles(codeTable: PosCodeTable.westEur),
  //   containsChinese: true,
  // );

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

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

1 回复

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


esc_pos_utils_x 是一个用于 Flutter 的插件,它可以帮助你生成 ESC/POS 打印命令,以便与支持 ESC/POS 协议的蓝牙打印机进行通信。这个插件主要用于生成打印内容,如文本、图像、条形码等,并将其发送到打印机。

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

1. 添加依赖

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

dependencies:
  esc_pos_utils_x: ^1.0.0

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

2. 导入包

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

import 'package:esc_pos_utils_x/esc_pos_utils_x.dart';

3. 创建打印内容

使用 Generator 类来生成打印内容。你可以添加文本、图像、条形码等。

final generator = Generator(PaperSize.mm80, await CapabilityProfile.load());

List<int> bytes = [];

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

// 添加条形码
bytes += generator.barcode(Barcode.upcA('123456789012'));

// 添加图像
final ByteData data = await rootBundle.load('assets/logo.png');
final Uint8List imageBytes = data.buffer.asUint8List();
final Image image = decodeImage(imageBytes);
bytes += generator.image(image);

// 切纸
bytes += generator.cut();

4. 发送打印数据到蓝牙打印机

你需要使用另一个插件(如 flutter_blueflutter_reactive_ble)来连接蓝牙打印机并发送打印数据。

以下是一个使用 flutter_blue 的示例:

import 'package:flutter_blue/flutter_blue.dart';

Future<void> printData(List<int> bytes) 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().then((_) {
          // 发现服务
          result.device.discoverServices().then((services) {
            for (BluetoothService service in services) {
              if (service.uuid.toString() == '000018f0-0000-1000-8000-00805f9b34fb') {
                for (BluetoothCharacteristic characteristic in service.characteristics) {
                  if (characteristic.uuid.toString() == '00002af1-0000-1000-8000-00805f9b34fb') {
                    // 发送打印数据
                    characteristic.write(bytes);
                  }
                }
              }
            }
          });
        });
      }
    }
  });
}

5. 调用打印函数

最后,调用 printData 函数并传入生成的打印数据:

printData(bytes);
回到顶部