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')));
}
}
}
注意事项
- 设备兼容性:确保你的设备是Sunmi支持的设备,并且已经正确连接。
- 权限配置:确保你的应用已经配置了必要的权限,如蓝牙权限(如果使用的是蓝牙打印)。
- 数据格式:根据实际需求调整票据数据的内容和格式。
这个示例展示了如何使用sunmi_print_ticket
插件进行基本的票据打印。根据你的实际需求,你可能需要调整票据的内容和格式。希望这能帮助你在Flutter项目中实现票据打印功能。