Flutter票据打印插件sunmi_print_ticket的使用

Flutter票据打印插件sunmi_print_ticket的使用

重要事项

此插件仅支持Android平台!

  • ✅ 跳行(n)行
  • ✅ 开启/关闭加粗模式
  • ✅ 调整字体大小
  • ✅ 可以打印二维码
  • ✅ 可以打印表格
  • ✅ 使用SignikaNegative-Bold字体作为大字体
  • ✅ 使用OpenSans-Bold字体作为大字体
  • ✅ 将字体大小设置为20作为中心字体大小,以区分两种字体
  • ✅ 切纸 - 专用方法用于切割行

测试设备

Sunmi V2 Pro

导入包

import 'package:easy_ticket_b08/features/printer_pos/service_printer_pos/sunmi_printer.dart';
// 所有sunmi打印机的方法都需要异步等待
await SunmiPrinter.bindPrinterService(); // 初始化打印机
await SunmiPrinter.startPrinter(); // 启动打印机
await SunmiPrinter.printLine(3); // 跳过(3)行
await SunmiPrinter.cutPaper(); // 切纸
await SunmiPrinter.unbindPrinterService(); // 解绑打印机

示例:打印停车票

await SunmiPrinter.startPrinter();
await SunmiPrinter.printText(text: AppConst.nameCompany, bold: true, size: 20);
await SunmiPrinter.printText(text: "${AppConst.taxCodeName} ${AppConst.taxCodeCustomer}", bold: false, size: 20); // size =20 : 打印机字体大小
await SunmiPrinter.setAlignment(1); // 0 : 左对齐, 1 : 居中对齐, 2 : 右对齐
await SunmiPrinter.printLine(3); // 跳过(3)行
await SunmiPrinter.cutPaper(); // 专用方法用于切割行

示例:打印发票表格

await SunmiPrinter.printTable(size: 21, cols: [
    ColumnMaker(text: '名称', width: 10, align: 0), // width: 10 : 列宽, 0 - 左对齐, 1 - 居中对齐, 2 - 右对齐
    ColumnMaker(text: '数量', width: 6, align: 1),
    ColumnMaker(text: '单位', width: 10, align: 2),
    ColumnMaker(text: '总价', width: 10, align: 2),
]);
await SunmiPrinter.printTable(cols: [
    ColumnMaker(text: '产品A', width: 10, align: 0),
    ColumnMaker(text: '4x', width: 6, align: 1),
    ColumnMaker(text: '30.00000', width: 10, align: 2),
    ColumnMaker(text: '120.00000', width: 10, align: 2),
]);

class ColumnMaker {
    String text;
    int width;
    int align;
    ColumnMaker({
        this.text = '',
        this.width = 2,
        this.align = 0,
    });
}

示例:打印二维码

await SunmiPrinter.setAlignment(1); // 将二维码调整到居中位置
await SunmiPrinter.printQr(
    dataQRCode:"https://github.com/hueht21",
    modulesize: 5,
    errorlevel: 2);

完整示例代码

import 'package:flutter/material.dart';
import 'package:sunmi_print_ticket/sunmi_print_ticket.dart';
import 'package:intl/intl.dart';

void main() {
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      title: "应用",
      home: HomePrinterView()
    ),
  );
}

class HomePrinterView extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Column(
          children: [
            const SizedBox(
              height: 60,
            ),
            Center(
              child: ElevatedButton(
                onPressed: () async {
                  await SunmiPrinter.bindPrinterService();
                  await SunmiPrinter.initPrinter();
                  await SunmiPrinter.startTransactionPrint(true);
                  await SunmiPrinter.printText(
                      text: AppConst.nameCompany, bold: true, size: 20);
                  await SunmiPrinter.printText(
                      text: AppConst.addressConpany,
                      bold: false,
                      size: 18,
                      underLine: false);
                  await SunmiPrinter.printText(
                      text:
                      "${AppConst.taxCodeName} ${AppConst.taxCodeCustomer}",
                      bold: false,
                      size: 20);
                  await SunmiPrinter.setAlignment(1);
                  await SunmiPrinter.printText(
                      text: AppConst.nameTicket, bold: false, size: 27);
                  await SunmiPrinter.setAlignment(1);
                  await SunmiPrinter.printText(
                      text:
                      "${AppConst.fareTicket} ${AppConst.moneyTicket} 元",
                      bold: false,
                      size: 25);
                  await SunmiPrinter.setAlignment(1);
                  // 进入时间
                  await SunmiPrinter.printText(
                      text:
                      "${AppConst.ticketStartingDateHP} ${DateTime.now().hour} h ${DateTime.now().minute} p",
                      bold: false,
                      size: 20);
                  await SunmiPrinter.setAlignment(1);
                  await SunmiPrinter.printText(
                      text:
                      "${AppConst.day} ${DateTime.now().day} ${AppConst.month} ${DateTime.now().month} ${AppConst.year} ${DateTime.now().year}",
                      bold: false,
                      size: 19);
                  await SunmiPrinter.setAlignment(1);
                  await SunmiPrinter.printText(
                      text:
                      "${AppConst.ncc} ${AppConst.nameCompanyNCC} - ${AppConst.nameTaxCode} ${AppConst.taxCode} \n \t ${AppConst.custommerService} ${AppConst.phoneCustomerService}",
                      bold: true,
                      size: 17);
                  await SunmiPrinter.printLine(3);
                  //await SunmiPrinter.cutPaper();
                  await SunmiPrinter.submitTransactionPrint();
                  await SunmiPrinter.exitTransactionPrint(true);
                  await SunmiPrinter.unbindPrinterService();
                },
                child: const Text("打印票"),
              ),
            ),
            Center(
              child: ElevatedButton(
                // 打印表格
                onPressed: () async {
                  await SunmiPrinter.bindPrinterService();
                  await SunmiPrinter.initPrinter();
                  await SunmiPrinter.printTable(size: 21, cols: [
                    ColumnMaker(text: '名称', width: 10, align: 0),
                    ColumnMaker(text: '数量', width: 6, align: 1),
                    ColumnMaker(text: '单位', width: 10, align: 2),
                    ColumnMaker(text: '总价', width: 10, align: 2),
                  ]);
                  await SunmiPrinter.printTable(cols: [
                    ColumnMaker(text: '薯条', width: 10, align: 0),
                    ColumnMaker(text: '4x', width: 6, align: 1),
                    ColumnMaker(text: '3.00', width: 10, align: 2),
                    ColumnMaker(text: '12.00', width: 10, align: 2),
                  ]);
                  await SunmiPrinter.printTable(cols: [
                    ColumnMaker(text: '产品A', width: 10, align: 0),
                    ColumnMaker(text: '4x', width: 6, align: 1),
                    ColumnMaker(text: '30.00000', width: 10, align: 2),
                    ColumnMaker(text: '120.00000', width: 10, align: 2),
                  ]);
                  //await SunmiPrinter.initPrinterExam();
                  await SunmiPrinter.printLine(3);
                  await SunmiPrinter.cutPaper();
                  await SunmiPrinter.unbindPrinterService();
                },
                child: const Text("打印表格"),
              ),
            ),
            Center(
              child: ElevatedButton(
                onPressed: () async {
                  await SunmiPrinter.bindPrinterService();
                  await SunmiPrinter.initPrinter();
                  await SunmiPrinter.printText(
                      text: AppConst.nameCompany2, bold: true, size: 20);
                  await SunmiPrinter.printText(
                      text: AppConst.addressConpany2,
                      bold: false,
                      size: 18,
                      underLine: false);
                  await SunmiPrinter.printText(
                      text:
                      "${AppConst.taxCodeName} ${AppConst.taxCodeCustomer}",
                      bold: false,
                      size: 21);
                  await SunmiPrinter.setAlignment(1);
                  await SunmiPrinter.printText(
                      text: AppConst.nameTicket2, bold: false, size: 30);
                  await SunmiPrinter.setAlignment(1);
                  await SunmiPrinter.printText(
                      text: AppConst.location, bold: false, size: 27);
                  await SunmiPrinter.setAlignment(1);
                  await SunmiPrinter.printText(
                      text:
                      "${AppConst.fareTicket} ${AppConst.moneyTicket2} 元",
                      bold: false,
                      size: 25);

                  await SunmiPrinter.setAlignment(1);
                  await SunmiPrinter.printText(
                      text:
                      "${AppConst.ticketStartingDate} ${DateTime.now().hour} h ${DateTime.now().minute} p ",
                      bold: false,
                      size: 20);
                  await SunmiPrinter.setAlignment(1);
                  await SunmiPrinter.printText(
                      text:
                      "${AppConst.day} ${DateTime.now().day} ${AppConst.month} ${DateTime.now().month} ${AppConst.year} ${DateTime.now().year}",
                      bold: false,
                      size: 19);
                  await SunmiPrinter.setAlignment(1);
                  await SunmiPrinter.printText(
                      text:
                      "${AppConst.ncc} ${AppConst.nameCompanyNCC} - ${AppConst.nameTaxCode} ${AppConst.taxCode} \n \t ${AppConst.custommerService} ${AppConst.phoneCustomerService}",
                      bold: true,
                      size: 17);

                  await SunmiPrinter.printLine(3);
                  await SunmiPrinter.cutPaper();
                  await SunmiPrinter.unbindPrinterService();
                },
                child: const Text("北宁 - 清化"),
              ),
            ),
            Center(
              child: ElevatedButton(
                onPressed: () async {
                  await SunmiPrinter.bindPrinterService();
                  await SunmiPrinter.initPrinter();
                  await SunmiPrinter.printBarCode(
                      dataBarCode: "0123648445",
                      symbology: 1,
                      height: 162,
                      width: 2,
                      textposition: 1);
                  await SunmiPrinter.cutPaper();
                  await SunmiPrinter.unbindPrinterService();
                },
                child: const Text("条形码"),
              ),
            ),
            Center(
              child: ElevatedButton(
                onPressed: () async {
                  await SunmiPrinter.bindPrinterService();
                  await SunmiPrinter.initPrinter();
                  await SunmiPrinter.setAlignment(1);
                  await SunmiPrinter.printQr(
                      dataQRCode: "https://github.com/hueht21",
                      modulesize: 5,
                      errorlevel: 2);
                  await SunmiPrinter.printLine(3);
                  await SunmiPrinter.cutPaper();
                  await SunmiPrinter.unbindPrinterService();
                },
                child: const Text("二维码"),
              ),
            )
          ],
        ),
      ),
    );
  }
}

class AppConst {
  static const String nameCompany = "CÔNG TY TNHH GIẢI PHÁP ĐÔ THỊ NAM HẢI";
  static const String addressConpany = "Số 33 Ngõ 151 Láng Hạ, Đống Đa, Hà Nội";
  static const String nameTicket = "VÉ TRÔNG GIỮ XE Ô TÔ";
  static const String fareTicket = "价格: ";
  static const String ticketStartingDateHP = "车辆进入时间:";
  static const String day = "日";
  static const String month = "月";
  static const String year = "年";
  static const String ncc = "NCC";
  static const String nameTaxCode = "税号";
  static const String taxCode = "0105987432";
  static const String nameCompanyNCC = "Softdreams";
  static const String custommerService = "客户服务";
  static const String moneyTicket = "25,000";
  static const String phoneCustomerService = "19003369";
  static const String taxCodeName = "税号:";
  static const String taxCodeCustomer = "12589654";

  static const String nameCompany2 = "CÔNG TY CPTVXDMT VÀ VT THÀNH AN";
  static const String addressConpany2 =
      "寿丰乡寿丰村7组, 寿丰乡, 清化省";
  static const String nameTicket2 = "车票";
  static const String moneyTicket2 = "90,000";
  static const String ticketStartingDate = "发车时间: ";
  static const String location = "北宁 - 清化";
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用sunmi_print_ticket插件进行票据打印的示例代码。这个插件通常用于Sunmi设备(如Sunmi V1、V2等)的票据打印功能。请确保你已经在pubspec.yaml文件中添加了该插件的依赖,并且已经正确配置了你的开发环境。

首先,确保你的pubspec.yaml中包含以下依赖:

dependencies:
  flutter:
    sdk: flutter
  sunmi_print_ticket: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,你可以在你的Flutter项目中按照以下步骤使用sunmi_print_ticket插件进行票据打印。

1. 导入插件

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

import 'package:sunmi_print_ticket/sunmi_print_ticket.dart';

2. 初始化插件并打印票据

以下是一个简单的示例,展示如何初始化插件并打印一张票据:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Sunmi Print Ticket Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _printTicket,
            child: Text('Print Ticket'),
          ),
        ),
      ),
    );
  }

  Future<void> _printTicket() async {
    // 初始化插件
    final SunmiPrintTicket printTicket = SunmiPrintTicket();

    // 配置票据内容
    final List<Map<String, dynamic>> ticketData = [
      {
        'type': 'text',
        'data': {
          'text': '店铺名称',
          'fontSize': 24,
          'align': 'center',
          'margin': {'top': 10, 'bottom': 10},
        },
      },
      {
        'type': 'text',
        'data': {
          'text': '日期: 2023-10-01',
          'fontSize': 18,
          'align': 'left',
          'margin': {'bottom': 10},
        },
      },
      {
        'type': 'text',
        'data': {
          'text': '商品名称\t\t单价\t\t数量\t\t金额',
          'fontSize': 18,
          'underline': true,
          'align': 'left',
          'margin': {'bottom': 5},
        },
      },
      {
        'type': 'text',
        'data': {
          'text': '苹果\t\t\t¥5.00\t\t2\t\t¥10.00',
          'fontSize': 18,
          'align': 'left',
          'margin': {'bottom': 5},
        },
      },
      {
        'type': 'text',
        'data': {
          'text': '香蕉\t\t\t¥3.00\t\t3\t\t¥9.00',
          'fontSize': 18,
          'align': 'left',
          'margin': {'bottom': 10},
        },
      },
      {
        'type': 'text',
        'data': {
          'text': '----------------------',
          'fontSize': 18,
          'underline': true,
          'align': 'left',
          'margin': {'bottom': 5},
        },
      },
      {
        'type': 'text',
        'data': {
          'text': '总计: ¥19.00',
          'fontSize': 24,
          'align': 'right',
          'margin': {'bottom': 10},
        },
      },
      {
        'type': 'barcode',
        'data': {
          'text': '123456789012',
          'height': 50,
          'width': 2,
          'margin': {'bottom': 10},
        },
      },
      // 可以继续添加其他类型的内容,如二维码等
    ];

    try {
      // 打印票据
      await printTicket.printTicket(data: ticketData);
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('票据打印成功')));
    } catch (e) {
      // 处理错误
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('票据打印失败: $e')));
    }
  }
}

注意事项

  1. 设备兼容性:确保你的设备是Sunmi支持的设备,并且已经正确连接。
  2. 权限配置:确保你的应用已经配置了必要的权限,如蓝牙权限(如果使用的是蓝牙打印)。
  3. 数据格式:根据实际需求调整票据数据的内容和格式。

这个示例展示了如何使用sunmi_print_ticket插件进行基本的票据打印。根据你的实际需求,你可能需要调整票据的内容和格式。希望这能帮助你在Flutter项目中实现票据打印功能。

回到顶部