Flutter网络打印机控制插件flutter_esc_pos_network的使用

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

Flutter网络打印机控制插件 flutter_esc_pos_network 的使用

flutter_esc_pos_network 是一个用于通过ESC/POS协议控制WiFi/Ethernet热敏打印机的Flutter插件。对于蓝牙打印机,请使用 esc_pos_bluetooth 插件。

该插件可以在Flutter或纯Dart项目中使用,并且支持Android、iOS、Windows、Linux和MacOS平台。为了扫描网络中的打印机,可以考虑使用ping_discover_network包。请注意,默认情况下大多数ESC/POS打印机监听9100端口。

功能待办(欢迎PR!)

  • 使用 GS ( k 命令打印QR码(从图像打印QR码已支持)
  • 使用 GS ( k 命令打印PDF-417条形码
  • 使用 ESC 3 <n> 命令设置行间距

如何帮助改进

  • 测试您的打印机并将其添加到表中:Wifi/Network printerBluetooth printer
  • 测试并报告错误
  • 分享关于如何改进的想法(代码优化,新功能等)
  • 欢迎提交PR!

已测试的打印机

这里有一些与本库兼容的打印机列表,请添加您测试过的模型以维护和改进此库,并帮助他人选择合适的打印机。

生成收据

简单收据带样式示例

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

更多例子请参考 flutter_esc_pos_utils

打印收据

import 'package:flutter_esc_pos_network/flutter_esc_pos_network.dart';

final printer = PrinterNetworkManager('192.168.1.100');
PosPrintResult connect = await printer.connect();
if (connect == PosPrintResult.success) {
  PosPrintResult printing = await printer.printTicket(ticket);
  print(printing.msg);
  printer.disconnect();
}

完整示例

下面是一个完整的示例,展示了如何创建并打印一张包含文本、条形码等内容的票据:

import 'package:flutter_esc_pos_utils/flutter_esc_pos_utils.dart';
import 'package:flutter_esc_pos_network/flutter_esc_pos_network.dart';

class NetworkPrinter {
  Future<List<int>> testTicket() 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: const PosStyles(codeTable: 'CP1252'));
    bytes += generator.text('Special 2: blåbærgrød',
        styles: const PosStyles(codeTable: 'CP1252'));

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

    bytes += generator.row([
      PosColumn(
        text: 'col3',
        width: 3,
        styles: const PosStyles(align: PosAlign.center, underline: true),
      ),
      PosColumn(
        text: 'col6',
        width: 6,
        styles: const PosStyles(align: PosAlign.center, underline: true),
      ),
      PosColumn(
        text: 'col3',
        width: 3,
        styles: const PosStyles(align: PosAlign.center, underline: true),
      ),
    ]);

    bytes += generator.text('Text size 200%',
        styles: const PosStyles(
          height: PosTextSize.size2,
          width: PosTextSize.size2,
        ));

    // Print barcode
    final List<int> barData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 4];
    bytes += generator.barcode(Barcode.upcA(barData));

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

  Future<void> printTicket(List<int> ticket) async {
    final printer = PrinterNetworkManager('192.168.1.100');
    PosPrintResult connect = await printer.connect();
    if (connect == PosPrintResult.success) {
      PosPrintResult printing = await printer.printTicket(ticket);
      print(printing.msg);
      printer.disconnect();
    }
  }
}

这个示例首先定义了一个方法来生成票据内容,然后通过网络连接到指定IP地址的打印机并打印该票据。请确保替换 '192.168.1.100' 为实际打印机的IP地址。


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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_esc_pos_network插件来控制网络打印机的示例代码。这个插件允许你通过网络(例如TCP/IP)向ESC/POS兼容的打印机发送命令。

首先,确保你的Flutter项目中已经添加了flutter_esc_pos_network依赖。在pubspec.yaml文件中添加以下依赖:

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

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

接下来,下面是一个完整的示例代码,展示了如何使用flutter_esc_pos_network插件来发送打印命令到网络打印机。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter ESC/POS Network Printer',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PrinterHomeScreen(),
    );
  }
}

class PrinterHomeScreen extends StatefulWidget {
  @override
  _PrinterHomeScreenState createState() => _PrinterHomeScreenState();
}

class _PrinterHomeScreenState extends State<PrinterHomeScreen> {
  final String printerIp = '192.168.1.100';  // 替换为你的打印机IP地址
  final int printerPort = 9100;  // 替换为你的打印机端口号

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Printer Control'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            await printReceipt();
          },
          child: Text('Print Receipt'),
        ),
      ),
    );
  }

  Future<void> printReceipt() async {
    try {
      NetworkPrinter printer = NetworkPrinter(printerIp, printerPort);
      
      // 发送初始化和切纸命令
      await printer.initPrinter();
      await printer.cutPaper();

      // 打印一行文本
      await printer.printText('Hello, this is a test receipt!\n');

      // 打印一行带有加粗和居中的文本
      await printer.setAlign(Align.CENTER);
      await printer.setBold(true);
      await printer.printText('CENTERED & BOLD TEXT\n');
      await printer.setBold(false);

      // 打印二维码(需要二维码数据)
      String qrCodeData = 'https://example.com';
      await printer.printQRCode(qrCodeData, size: 100);

      // 结束打印并切纸
      await printer.cutPaper();
      
      print('Receipt printed successfully!');
    } catch (e) {
      print('Failed to print receipt: $e');
    }
  }
}

说明:

  1. IP地址和端口:在NetworkPrinter初始化时,你需要提供打印机的IP地址和端口号。
  2. 初始化打印机initPrinter()方法用于初始化打印机。
  3. 打印文本printText()方法用于打印普通文本。
  4. 文本对齐和加粗:通过setAlign()setBold()方法可以设置文本的对齐方式和加粗效果。
  5. 打印二维码printQRCode()方法用于打印二维码,你需要提供二维码的数据内容。
  6. 切纸cutPaper()方法用于在打印完成后切纸。

注意事项:

  • 确保你的打印机是ESC/POS兼容的,并且已经连接到你的网络中。
  • 确保你的Flutter应用有访问网络的权限(在Android上需要在AndroidManifest.xml中添加INTERNET权限)。

希望这个示例代码对你有所帮助!如果有更多问题,欢迎继续提问。

回到顶部