Flutter打印机控制插件esc_pos_utils_updated的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter打印机控制插件esc_pos_utils_updated的使用

标题

esc_pos_utils

内容

Base Flutter/Dart classes for ESC/POS printing. Generator class generates ESC/POS commands that can be sent to a thermal printer.

This is the “base” library that useded for:

主要功能

  1. 连接到Wi-Fi / Ethernet打印机
  2. 使用text方法简单文本打印
  3. 使用row方法打印表格
  4. 文本样式:
    • 大小,对齐方式,粗体,反向,下划线,不同字体,旋转90°
  5. 打印图像
  6. 打印条形码
    • UPC-A, UPC-E, JAN13 (EAN13), JAN8 (EAN8), CODE39, ITF (Interleaved 2of 5), CODABAR (NW-7), CODE128
  7. 纸张裁剪(部分、全)
  8. 发出蜂鸣声(不同持续时间)
  9. 纸张进纸,反转进纸

Note: 您的打印机可能不支持上述所有功能(某些样式、部分/全纸张裁剪、反转进纸、条形码…)。

生成一张票

简单带有样式的票
List<int> testTicket() {
  final List<int> bytes = [];
  // 使用默认配置
  final profile = await CapabilityProfile.load();
  final generator = Generator(PaperSize.mm80, profile);
  List<int> bytes = [];

  bytes += generator.text(
      'Regular: aA bB cC dD eD 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),
    ),
]);
打印图像
import 'dart: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));
打印二维码
String qrData = "example.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);
}

使用代码表

不同的打印机支持不同的代码表。 如果您想更改默认代码表,选择正确的配置文件很重要:

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

如何帮助

  1. 添加一个配置文件以支持您的打印机型号。
  2. 测试您的打印机并添加到表中:[WiFi/网络打印机]((https://github.com/andrey-ushakov/esc_pos_printer/blob/master/printers.md) 或 Bluetooth打印机
  3. 测试和报告错误
  4. 分享关于改进的想法(代码优化,新功能等)

示例代码


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

1 回复

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


当然,以下是如何在Flutter项目中使用esc_pos_utils_updated插件来控制ESC/POS打印机的示例代码。esc_pos_utils_updated插件允许你通过蓝牙、USB、网络等接口发送ESC/POS命令来控制打印机。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  esc_pos_utils_updated: ^x.y.z  # 请替换为最新版本号

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

2. 导入插件

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

import 'package:esc_pos_utils_updated/esc_pos_utils_updated.dart';
import 'package:esc_pos_bluetooth/esc_pos_bluetooth.dart'; // 如果你使用蓝牙连接
import 'package:esc_pos_printer/esc_pos_printer.dart'; // 通用接口

3. 初始化打印机

这里以蓝牙打印机为例。首先,你需要扫描并连接到蓝牙打印机:

EscPosBluetooth bluetooth = EscPosBluetooth();
EscPosPrinter printer = EscPosPrinter();

// 扫描蓝牙设备
Future<void> scanDevices() async {
  List<EscPosBluetoothDevice> devices = await bluetooth.scanDevices();
  print("Found devices: $devices");
  // 你可以让用户选择一个设备并进行连接
}

// 连接到蓝牙打印机
Future<void> connectToPrinter(EscPosBluetoothDevice device) async {
  bool isConnected = await bluetooth.connect(device.address);
  if (isConnected) {
    printer.bluetoothAdapter = bluetooth;
    printer.open();
    print("Connected to printer");
  } else {
    print("Failed to connect to printer");
  }
}

4. 发送打印命令

一旦连接成功,你可以发送ESC/POS命令来打印内容:

Future<void> printReceipt() async {
  if (printer.isConnected()) {
    await printer.text('Hello, ESC/POS!\n');
    await printer.text('This is a receipt.\n');
    await printer.cut();
    printer.close();
  } else {
    print("Printer is not connected");
  }
}

5. 完整示例

以下是一个完整的示例,包括扫描、连接和打印:

import 'package:flutter/material.dart';
import 'package:esc_pos_utils_updated/esc_pos_utils_updated.dart';
import 'package:esc_pos_bluetooth/esc_pos_bluetooth.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  EscPosBluetooth bluetooth = EscPosBluetooth();
  EscPosPrinter printer = EscPosPrinter();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('ESC/POS Printer Control'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: scanDevices,
                child: Text('Scan Devices'),
              ),
              // 假设你已经选择了一个设备并存储在某个变量中
              // EscPosBluetoothDevice selectedDevice;
              // ElevatedButton(
              //   onPressed: () async => await connectToPrinter(selectedDevice),
              //   child: Text('Connect to Printer'),
              // ),
              ElevatedButton(
                onPressed: printReceipt,
                child: Text('Print Receipt'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Future<void> scanDevices() async {
    List<EscPosBluetoothDevice> devices = await bluetooth.scanDevices();
    print("Found devices: $devices");
    // 显示设备列表让用户选择,这里省略
  }

  // connectToPrinter 方法同上

  Future<void> printReceipt() async {
    if (printer.isConnected()) {
      await printer.text('Hello, ESC/POS!\n');
      await printer.text('This is a receipt.\n');
      await printer.cut();
      printer.close();
    } else {
      print("Printer is not connected");
      // 显示提示信息给用户,这里省略
    }
  }
}

注意:这个示例省略了用户选择蓝牙设备的界面部分,你需要根据实际需求实现设备选择逻辑。

希望这个示例能帮助你更好地理解如何在Flutter项目中使用esc_pos_utils_updated插件来控制ESC/POS打印机。

回到顶部