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

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

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

简介

esc_pos_dart 是一个用于 Dart(非 Flutter 依赖)的 ESC/POS 热敏打印机支持库。它基于 esc_pos_printeresc_pos_utils 包,但去除了对 Flutter 的依赖,使其可以在纯 Dart 应用中使用。

使用方法

以下是使用 esc_pos_dart 插件的完整示例代码,展示了如何连接到热敏打印机并通过网络打印简单的文本和收据。

import 'package:esc_pos_dart/esc_pos_dart.dart';
import 'package:image/image.dart';
import 'package:intl/intl.dart';

Future<void> main(List<String> args) async {
  // 获取打印机的 IP 地址和端口,默认端口为 9100
  var ip = args[0];
  var port = args.length > 1 ? int.parse(args[1]) : 9100;

  print('** 打印到: $ip $port');

  // 获取可用的打印机配置文件
  var profiles = await CapabilityProfile.getAvailableProfiles();

  for (var p in profiles) {
    print('-- $p');
  }

  // 加载默认的打印机配置文件
  var profile = await CapabilityProfile.load();

  // 创建一个网络打印机实例,指定纸张大小和配置文件
  final printer = NetworkPrinter(PaperSize.mm80, profile);

  // 连接到打印机
  final res = await printer.connect(ip, port: port);
  print('-- 打印机连接: $res');

  // 打印 "Hello World"
  var printOK1 = await printHelloWorld(printer);
  print('-- 第一次打印完成: ${printOK1 ? '成功' : '失败'}');

  // 确保打印机连接
  await printer.ensureConnected();

  // 打印演示收据
  var printOK2 = await printDemoReceipt(printer);
  print('-- 第二次打印完成: ${printOK2 ? '成功' : '失败'}');
}

Future<bool> printHelloWorld(NetworkPrinter printer) async {
  print('-----------------------------------------------------------------');
  print('** 打印 Hello World:');

  // 添加一行空白
  printer.feed(1);

  // 打印水平线
  printer.hr();
  // 打印 "Hello" 居左,"World!" 居右
  printer.text('Hello', styles: PosStyles(align: PosAlign.left));
  printer.text('World!', styles: PosStyles(align: PosAlign.right));
  // 再次打印水平线
  printer.hr();

  // 添加一行空白
  printer.feed(1);
  // 切纸
  printer.cut();
  // 再添加一行空白
  printer.feed(1);

  // 结束打印任务
  printer.endJob();

  // 断开连接,延迟300毫秒
  printer.disconnect(delayMs: 300);

  return true;
}

Future<bool> printDemoReceipt(NetworkPrinter printer) async {
  print('-----------------------------------------------------------------');
  print('** 打印演示收据:');

  // 打印图像
  final bytes = await Resource('package:esc_pos_dart/resources/rabbit_black.jpg').readAsBytes();
  final image = decodeImage(bytes)!;

  printer.image(image);

  // 打印商店信息
  printer.text('GROCERYLY',
      styles: PosStyles(
        align: PosAlign.center,
        height: PosTextSize.size2,
        width: PosTextSize.size2,
      ),
      linesAfter: 1);

  printer.text('889 Watson Lane', styles: PosStyles(align: PosAlign.center));
  printer.text('New Braunfels, TX', styles: PosStyles(align: PosAlign.center));
  printer.text('Tel: 830-221-1234', styles: PosStyles(align: PosAlign.center));
  printer.text('Web: www.example.com',
      styles: PosStyles(align: PosAlign.center), linesAfter: 1);

  // 打印水平线
  printer.hr();

  // 打印表格头
  printer.row([
    PosColumn(text: '数量', width: 1),
    PosColumn(text: '商品', width: 7),
    PosColumn(text: '单价', width: 2, styles: PosStyles(align: PosAlign.right)),
    PosColumn(text: '总价', width: 2, styles: PosStyles(align: PosAlign.right)),
  ]);

  // 打印商品列表
  printer.row([
    PosColumn(text: '2', width: 1),
    PosColumn(text: '洋葱圈', width: 7),
    PosColumn(text: '0.99', width: 2, styles: PosStyles(align: PosAlign.right)),
    PosColumn(text: '1.98', width: 2, styles: PosStyles(align: PosAlign.right)),
  ]);

  printer.row([
    PosColumn(text: '1', width: 1),
    PosColumn(text: '比萨', width: 7),
    PosColumn(text: '3.45', width: 2, styles: PosStyles(align: PosAlign.right)),
    PosColumn(text: '3.45', width: 2, styles: PosStyles(align: PosAlign.right)),
  ]);

  printer.row([
    PosColumn(text: '1', width: 1),
    PosColumn(text: '春卷', width: 7),
    PosColumn(text: '2.99', width: 2, styles: PosStyles(align: PosAlign.right)),
    PosColumn(text: '2.99', width: 2, styles: PosStyles(align: PosAlign.right)),
  ]);

  printer.row([
    PosColumn(text: '3', width: 1),
    PosColumn(text: '脆条', width: 7),
    PosColumn(text: '0.85', width: 2, styles: PosStyles(align: PosAlign.right)),
    PosColumn(text: '2.55', width: 2, styles: PosStyles(align: PosAlign.right)),
  ]);

  // 打印水平线
  printer.hr();

  // 打印总计
  printer.row([
    PosColumn(
        text: '总计',
        width: 6,
        styles: PosStyles(
          height: PosTextSize.size2,
          width: PosTextSize.size2,
        )),
    PosColumn(
        text: '\$10.97',
        width: 6,
        styles: PosStyles(
          align: PosAlign.right,
          height: PosTextSize.size2,
          width: PosTextSize.size2,
        )),
  ]);

  // 打印双线
  printer.hr(ch: '=', linesAfter: 1);

  // 打印支付信息
  printer.row([
    PosColumn(
        text: '现金',
        width: 8,
        styles: PosStyles(align: PosAlign.right, width: PosTextSize.size2)),
    PosColumn(
        text: '\$15.00',
        width: 4,
        styles: PosStyles(align: PosAlign.right, width: PosTextSize.size2)),
  ]);

  printer.row([
    PosColumn(
        text: '找零',
        width: 8,
        styles: PosStyles(align: PosAlign.right, width: PosTextSize.size2)),
    PosColumn(
        text: '\$4.03',
        width: 4,
        styles: PosStyles(align: PosAlign.right, width: PosTextSize.size2)),
  ]);

  // 添加两行空白
  printer.feed(2);
  // 打印感谢语
  printer.text('谢谢光临!',
      styles: PosStyles(align: PosAlign.center, bold: true));

  // 打印当前时间
  final now = DateTime.now();
  final formatter = DateFormat('MM/dd/yyyy H:m');
  final timestamp = formatter.format(now);

  printer.text(timestamp,
      styles: PosStyles(align: PosAlign.center), linesAfter: 2);

  // 添加一行空白
  printer.feed(1);
  // 切纸
  printer.cut();
  // 再添加一行空白
  printer.feed(1);

  // 结束打印任务
  printer.endJob();

  // 断开连接,延迟300毫秒
  printer.disconnect(delayMs: 300);

  return true;
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用esc_pos_dart插件来控制热敏打印机的示例代码。esc_pos_dart是一个用于Flutter的ESC/POS指令集打印机控制库,支持蓝牙、USB和网络连接的打印机。

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

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

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

接下来,是一个简单的示例代码,展示如何通过蓝牙连接到打印机并打印一些文本:

import 'package:flutter/material.dart';
import 'package:esc_pos_dart/esc_pos_dart.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? _bluetoothPrinter;
  EscPosPrinter? _printer;
  String _status = "Not Connected";

  @override
  void initState() {
    super.initState();
    initPrinter();
  }

  Future<void> initPrinter() async {
    _bluetoothPrinter = EscPosBluetooth();

    // 开始扫描蓝牙设备
    _bluetoothPrinter!.startDiscovery().then((devices) {
      // 假设我们已知打印机的蓝牙名称或地址
      String printerNameOrAddress = "Your_Printer_Name_Or_Address";
      BluetoothDevice? device = devices.firstWhere(
        (d) => d.name == printerNameOrAddress || d.address == printerNameOrAddress,
        orElse: () => null,
      );

      if (device != null) {
        // 连接到打印机
        _bluetoothPrinter!.connect(device.address).then((connectionId) {
          setState(() {
            _status = "Connected";
            _printer = EscPosPrinter(_bluetoothPrinter!, connectionId);
          });
          printReceipt();
        }).catchError((e) {
          print("Connection Error: $e");
        });
      } else {
        print("Printer not found");
      }
    }).catchError((e) {
      print("Discovery Error: $e");
    });
  }

  Future<void> printReceipt() async {
    if (_printer != null) {
      await _printer!.text('Hello, this is a test receipt.\n');
      await _printer!.text('Thank you for using our service.\n');
      await _printer!.cut();
    }
  }

  @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>[
              Text(
                'Printer Status: $_status',
                style: TextStyle(fontSize: 24),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  if (_printer != null) {
                    await printReceipt();
                  } else {
                    // 如果未连接,可以重新尝试连接
                    initPrinter();
                  }
                },
                child: Text('Print Receipt'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项

  1. Your_Printer_Name_Or_Address需要替换为你的热敏打印机的实际蓝牙名称或地址。
  2. 在实际项目中,你可能需要更复杂的错误处理和连接管理逻辑。
  3. 蓝牙权限需要在Android的AndroidManifest.xml文件中声明,并且在iOS项目中需要在Info.plist中配置蓝牙使用权限。

这个示例代码展示了如何通过蓝牙连接到热敏打印机并打印简单的文本。esc_pos_dart还支持更多的打印功能,如条形码、二维码、图片等,你可以查阅其官方文档获取更多信息。

回到顶部