Flutter打印工具插件flutter_esc_pos_utils_v2的使用

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

Flutter打印工具插件flutter_esc_pos_utils_v2的使用

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

这个基础库用于以下项目:

主要功能

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

注意: 您的打印机可能不支持上述所有功能(如某些样式、部分/全部纸张切割、倒退进纸、条形码等)。

生成票据

简单票据带样式

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 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功能:

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

注意:您的打印机可能只支持上述功能中的一部分。

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

如果您的打印机不支持原生命令,可以通过添加依赖项来打印二维码图像:

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

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

1 回复

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


当然,以下是一个关于如何使用Flutter打印工具插件flutter_esc_pos_utils_v2的代码案例。这个插件允许你通过蓝牙、USB或Wi-Fi连接到ESC/POS兼容的热敏打印机进行打印。

安装插件

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

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

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

导入包

在你的Dart文件中导入包:

import 'package:flutter_esc_pos_utils_v2/flutter_esc_pos_utils_v2.dart';

初始化蓝牙打印机

以下是一个使用蓝牙连接并打印简单文本的示例:

import 'package:flutter/material.dart';
import 'package:flutter_esc_pos_utils_v2/flutter_esc_pos_utils_v2.dart';

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

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

class _MyAppState extends State<MyApp> {
  BluetoothEscPosPrinter? _printer;

  @override
  void initState() {
    super.initState();
    // 初始化蓝牙打印机
    initBluetoothPrinter();
  }

  Future<void> initBluetoothPrinter() async {
    // 搜索蓝牙设备(这里假设你已经知道打印机的蓝牙地址)
    String printerAddress = 'XX:XX:XX:XX:XX:XX';  // 替换为你的打印机蓝牙地址
    _printer = BluetoothEscPosPrinter(printerAddress);

    // 连接到打印机
    await _printer!.connect();
    if (await _printer!.isConnected()) {
      print('Printer connected!');
      printReceipt();
    } else {
      print('Failed to connect to printer.');
    }
  }

  Future<void> printReceipt() async {
    if (_printer!.isConnected()) {
      // 打印文本
      await _printer!.printText('Hello, this is a test receipt!\n');
      
      // 打印换行
      await _printer!.newLine();
      
      // 打印二维码
      await _printer!.printQrCode('https://www.example.com', size: 100);
      
      // 打印条形码
      await _printer!.printBarcode(data: '123456789012', type: BarcodeFormat.CODE128);
      
      // 切纸
      await _printer!.cutPaper();
      
      // 断开连接
      await _printer!.disconnect();
    } else {
      print('Printer is not connected.');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter ESC/POS Printer Example'),
        ),
        body: Center(
          child: Text('Check your printer for the receipt!'),
        ),
      ),
    );
  }
}

注意事项

  1. 权限:确保在AndroidManifest.xmlInfo.plist中添加了必要的权限,特别是蓝牙权限。
  2. 错误处理:在实际应用中,你应该添加更多的错误处理逻辑,比如处理连接失败、打印失败等情况。
  3. 设备兼容性:确保你的设备和打印机兼容,并且蓝牙地址正确。
  4. 依赖版本:由于Flutter和插件的版本会不断更新,请确保使用最新的依赖版本,并查看官方文档以获取最新的API信息。

这个示例展示了如何使用flutter_esc_pos_utils_v2插件连接到蓝牙打印机并打印简单的文本、二维码和条形码。你可以根据需求进一步扩展这个示例。

回到顶部