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

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

插件简介

yjy_esc_pos_utils 是一个用于生成 ESC/POS 命令的 Flutter/Dart 库。这些命令可以发送到热敏打印机以实现打印功能。

此库是以下两个打印库的基础:

  • esc_pos_printer:支持通过 Wi-Fi 或以太网连接的打印机。
  • esc_pos_bluetooth:支持通过蓝牙连接的打印机。

主要特性

  • 支持 Wi-Fi 和以太网打印机的连接。
  • 简单的文本打印功能。
  • 表格打印功能。
  • 文本样式设置(大小、对齐方式、加粗、反转、下划线等)。
  • 图片打印。
  • 条形码打印(支持多种条形码类型)。
  • 支持纸张切割(部分切割、完全切割)。
  • 支持蜂鸣器操作。
  • 支持纸张进纸和反向进纸。

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


示例代码

以下是一个完整的示例,展示如何使用 yjy_esc_pos_utils 插件来生成并打印一张简单的票据。

import 'package:image/image.dart';
import 'dart:typed_data';
import 'package:flutter/services.dart';
import 'package:yjy_esc_pos_utils/esc_pos_utils.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.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 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));

  // 打印 QR Code
  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());

    bytes += generator.image(img!);
  } catch (e) {
    print(e);
  }

  // 打印换行并切割纸张
  bytes += generator.feed(2);
  bytes += generator.cut();

  // 输出生成的 ESC/POS 命令
  print(bytes);
}

代码详解

1. 初始化打印机配置

final profile = await CapabilityProfile.load();
final generator = Generator(PaperSize.mm80, profile);
  • CapabilityProfile.load():加载打印机配置文件。
  • Generator:创建生成器对象,指定纸张大小和配置文件。

2. 打印普通文本

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');
  • 使用 generator.text 方法打印普通文本。

3. 设置文本样式

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);
  • PosStyles:用于设置文本样式(加粗、反转、下划线等)。

4. 打印表格行

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)),
]);
  • 使用 generator.row 方法打印表格行。
  • PosColumn:定义列的宽度、文本内容和样式。

5. 打印图片

final ByteData data = await rootBundle.load('assets/logo.png');
final Uint8List imgBytes = data.buffer.asUint8List();
final Image image = decodeImage(imgBytes)!;
bytes += generator.image(image);
  • 使用 generator.image 方法打印图片。

6. 打印条形码

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

7. 打印 QR Code

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());
bytes += generator.image(img!);
  • 使用 QrPainter 生成 QR Code 图像,并将其转换为图片后打印。

8. 打印换行和切割纸张

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

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

1 回复

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


yjy_esc_pos_utils 是一个用于 Flutter 的热敏打印机控制插件,它允许你通过 ESC/POS 命令控制热敏打印机。这个插件支持多种打印机品牌和型号,并且可以生成 ESC/POS 命令来打印文本、图像、条形码等。

安装

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

dependencies:
  flutter:
    sdk: flutter
  yjy_esc_pos_utils: ^1.0.0

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

基本用法

1. 导入库

import 'package:yjy_esc_pos_utils/yjy_esc_pos_utils.dart';

2. 创建 Printer 对象

final Printer printer = Printer();

3. 生成 ESC/POS 命令

你可以使用 Printer 对象生成各种 ESC/POS 命令,例如打印文本、图像、条形码等。

final List<int> bytes = [];

// 初始化打印机
bytes += printer.reset();

// 设置对齐方式
bytes += printer.textAlign(TextAlign.center);

// 打印文本
bytes += printer.text('Hello, World!');

// 打印条形码
bytes += printer.barcode(Barcode.upcA('123456789012'));

// 打印图像
final ByteData data = await rootBundle.load('assets/logo.png');
final Uint8List imageBytes = data.buffer.asUint8List();
bytes += printer.image(imageBytes);

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

4. 发送 ESC/POS 命令到打印机

你需要使用蓝牙或网络连接将生成的 ESC/POS 命令发送到打印机。这里假设你使用的是蓝牙连接:

import 'package:flutter_blue/flutter_blue.dart';

final FlutterBlue flutterBlue = FlutterBlue.instance;

void sendToPrinter(List<int> bytes) async {
  // 搜索蓝牙设备
  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() == '00001800-0000-1000-8000-00805f9b34fb') {
                for (BluetoothCharacteristic characteristic in service.characteristics) {
                  if (characteristic.uuid.toString() == '00002a00-0000-1000-8000-00805f9b34fb') {
                    // 发送数据到打印机
                    characteristic.write(bytes);
                  }
                }
              }
            }
          });
        });
      }
    }
  });
}
回到顶部