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

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

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

esc_pos_printer 是一个用于通过ESC/POS协议控制热敏打印机的Flutter/Dart库。它支持WiFi/Ethernet连接的打印机,对于蓝牙打印机,请使用 esc_pos_bluetooth 库。

安装与配置

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

dependencies:
  esc_pos_printer: ^latest_version

然后运行 flutter pub get 来安装该插件。

使用步骤

连接打印机并打印示例

以下是一个完整的示例代码,展示了如何连接到网络打印机并打印一张收据:

import 'package:esc_pos_printer/esc_pos_printer.dart';
import 'package:esc_pos_utils/esc_pos_utils.dart';

void main() async {
  const PaperSize paper = PaperSize.mm80; // 设置纸张大小为80mm
  final profile = await CapabilityProfile.load(); // 加载打印机能力配置文件
  final printer = NetworkPrinter(paper, profile); // 创建网络打印机实例

  // 连接到打印机(IP地址和端口)
  final PosPrintResult res = await printer.connect('192.168.0.123', port: 9100);

  if (res == PosPrintResult.success) {
    testReceipt(printer); // 打印收据内容
    printer.disconnect(); // 断开打印机连接
  }

  print('Print result: ${res.msg}');
}

void testReceipt(NetworkPrinter printer) {
  printer.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');
  printer.text('Special 1: àÀ èÈ éÉ ûÛ üÜ çÇ ôÔ',
      styles: PosStyles(codeTable: 'CP1252'));
  printer.text('Special 2: blåbærgrød',
      styles: PosStyles(codeTable: 'CP1252'));

  printer.text('Bold text', styles: PosStyles(bold: true));
  printer.text('Reverse text', styles: PosStyles(reverse: true));
  printer.text('Underlined text',
      styles: PosStyles(underline: true), linesAfter: 1);
  printer.text('Align left', styles: PosStyles(align: PosAlign.left));
  printer.text('Align center', styles: PosStyles(align: PosAlign.center));
  printer.text('Align right',
      styles: PosStyles(align: PosAlign.right), linesAfter: 1);

  printer.text('Text size 200%',
      styles: PosStyles(
        height: PosTextSize.size2,
        width: PosTextSize.size2,
      ));

  printer.feed(2); // 喂纸两次
  printer.cut(); // 切断纸张
}

发现网络中的打印机

为了发现网络中的打印机,你可以使用 ping_discover_network 包。大多数ESC/POS打印机默认监听9100端口。

import 'package:ping_discover_network/ping_discover_network.dart';

void discoverPrinters() async {
  String subnet = "192.168.0"; // 替换为你的子网
  int port = 9100;
  final stream = NetworkAnalyzer.discover(subnet, port);

  stream.listen((NetworkAddress addr) {
    if (addr.exists) {
      print('Found device: ${addr.ip}');
    }
  });
}

测试与贡献

你可以测试自己的打印机,并在GitHub上提交你的测试结果来帮助改进这个库。更多待办事项和贡献方式请查看 TODOHow to Help 部分。

示例图片

以下是使用该库生成的示例收据图像: test receipt test receipt

更多示例和详细文档可以在 esc_pos_utils 中找到。


这段Markdown格式的内容包含了如何使用 `esc_pos_printer` 插件进行热敏打印机控制的基本信息、示例代码以及一些有用的链接和提示。希望对你有所帮助!

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

1 回复

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


当然,以下是一个关于如何使用Flutter热敏打印机控制插件esc_pos_printer的代码案例。这个插件允许你通过ESC/POS命令来控制热敏打印机。我们将展示如何安装插件、初始化打印机、打印文本和条形码。

1. 安装插件

首先,你需要在你的Flutter项目中添加esc_pos_printer插件。打开你的pubspec.yaml文件并添加以下依赖:

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

然后运行以下命令来安装插件:

flutter pub get

2. 初始化打印机

在你的Flutter应用中,你需要先初始化打印机连接。这里我们假设你使用的是蓝牙连接,但插件也支持USB和网络连接。

import 'package:esc_pos_printer/esc_pos_printer.dart';
import 'package:esc_pos_bluetooth_printer/esc_pos_bluetooth_printer.dart';
import 'package:flutter_bluetooth_serial/flutter_bluetooth_serial.dart';

BluetoothDevice? device;
BluetoothConnection? connection;
EscPosPrinter? printer;

Future<void> initPrinter() async {
  // 初始化蓝牙
  final flutterBluetoothSerial = FlutterBluetoothSerial.instance;

  // 获取已配对的设备列表
  List<BluetoothDevice> pairedDevices = await flutterBluetoothSerial.getBondedDevices();

  // 选择你要连接的设备(这里假设设备名称为"YourPrinterName")
  device = pairedDevices.firstOrNullWhere((d) => d.name == "YourPrinterName");

  if (device != null) {
    // 连接到设备
    connection = await device!.createConnection();
    await connection!.open();

    // 初始化打印机
    printer = EscPosPrinter(connection!.inputStream, connection!.outputStream);
  }
}

3. 打印文本和条形码

一旦打印机初始化完成,你就可以开始发送打印命令了。以下是一个打印文本和条形码的示例:

Future<void> printTextAndBarcode() async {
  if (printer != null && printer!.isConnected()) {
    try {
      // 打印文本
      await printer!.align(EscPosAlign.center);
      await printer!.text("Hello, ESC/POS Printer!\n\n");
      await printer!.text("This is a barcode example:\n");

      // 打印条形码
      await printer!.barcode(Barcode.code128("1234567890128"), width: 3, height: 100, position: EscPosAlign.center);

      // 切纸
      await printer!.cut();

      print("Printing done!");
    } catch (e) {
      print("Error printing: $e");
    } finally {
      // 关闭连接
      if (connection != null && connection!.isConnected()) {
        await connection!.close();
      }
    }
  } else {
    print("Printer is not connected!");
  }
}

4. 完整示例

将上述代码整合到一个完整的Flutter应用中:

import 'package:flutter/material.dart';
import 'package:esc_pos_printer/esc_pos_printer.dart';
import 'package:esc_pos_bluetooth_printer/esc_pos_bluetooth_printer.dart';
import 'package:flutter_bluetooth_serial/flutter_bluetooth_serial.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('ESC/POS Printer Example'),
        ),
        body: Center(
          child: MyPrinterWidget(),
        ),
      ),
    );
  }
}

class MyPrinterWidget extends StatefulWidget {
  @override
  _MyPrinterWidgetState createState() => _MyPrinterWidgetState();
}

class _MyPrinterWidgetState extends State<MyPrinterWidget> {
  BluetoothDevice? device;
  BluetoothConnection? connection;
  EscPosPrinter? printer;

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

  Future<void> initPrinter() async {
    final flutterBluetoothSerial = FlutterBluetoothSerial.instance;
    List<BluetoothDevice> pairedDevices = await flutterBluetoothSerial.getBondedDevices();
    device = pairedDevices.firstOrNullWhere((d) => d.name == "YourPrinterName");

    if (device != null) {
      connection = await device!.createConnection();
      await connection!.open();
      printer = EscPosPrinter(connection!.inputStream, connection!.outputStream);
    }
  }

  Future<void> printTextAndBarcode() async {
    if (printer != null && printer!.isConnected()) {
      try {
        await printer!.align(EscPosAlign.center);
        await printer!.text("Hello, ESC/POS Printer!\n\n");
        await printer!.text("This is a barcode example:\n");
        await printer!.barcode(Barcode.code128("1234567890128"), width: 3, height: 100, position: EscPosAlign.center);
        await printer!.cut();
        print("Printing done!");
      } catch (e) {
        print("Error printing: $e");
      } finally {
        if (connection != null && connection!.isConnected()) {
          await connection!.close();
        }
      }
    } else {
      print("Printer is not connected!");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ElevatedButton(
          onPressed: printTextAndBarcode,
          child: Text('Print'),
        ),
      ],
    );
  }
}

这个示例展示了如何使用esc_pos_printer插件来连接蓝牙热敏打印机并打印文本和条形码。请确保你已经配对了你的打印机,并且设备名称与代码中的一致。

回到顶部