Flutter蓝牙打印插件esc_pos_utils_x的使用
Flutter蓝牙打印插件esc_pos_utils_x的使用
简介
esc_pos_utils_x
是一个用于生成 ESC/POS 命令的 Flutter/Dart 库。这些命令可以发送到热敏打印机进行打印。该库是 esc_pos_printer
和 esc_pos_bluetooth
插件的基础。
特性
- 支持连接 Wi-Fi/以太网打印机。
- 简单的文本打印功能。
- 表格打印功能。
- 文本样式支持(大小、对齐方式、加粗、反白、下划线等)。
- 支持打印图片和条形码。
- 支持纸张切割(部分切割、全切割)、蜂鸣器控制、进纸和退纸等功能。
注意:您的打印机可能不支持所有列出的功能。
示例:生成票据
以下是一些示例代码,展示如何使用 esc_pos_utils_x
插件生成票据。
示例 1:简单的带样式的票据
List<int> testTicket() {
final List<int> bytes = [];
// 使用默认配置文件
final profile = await CapabilityProfile.load();
final generator = Generator(PaperSize.mm80, profile);
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: PosStyles(codeTable: PosCodeTable.westEur));
bytes += generator.text('Special 2: blåbærgrød',
styles: PosStyles(codeTable: PosCodeTable.westEur));
bytes += generator.text('Bold text', styles: PosStyles(bold: true));
bytes += generator.text('Reverse text', styles: PosStyles(reverse: true));
bytes += generator.text('Underlined text',
styles: PosStyles(underline: true), linesAfter: 1);
bytes += generator.text('Align left', styles: PosStyles(align: PosAlign.left));
bytes += generator.text('Align center', styles: PosStyles(align: PosAlign.center));
bytes += generator.text('Align right',
styles: PosStyles(align: PosAlign.right), linesAfter: 1);
bytes += generator.text('Text size 200%',
styles: PosStyles(
height: PosTextSize.size2,
width: PosTextSize.size2,
));
bytes += generator.feed(2);
bytes += generator.cut();
return bytes;
}
示例 2:打印表格行
generator.row([
PosColumn(
text: 'col3',
width: 3,
styles: PosStyles(align: PosAlign.center, underline: true),
),
PosColumn(
text: 'col6',
width: 6,
styles: PosStyles(align: PosAlign.center, underline: true),
),
PosColumn(
text: 'col3',
width: 3,
styles: PosStyles(align: PosAlign.center, underline: true),
),
]);
示例 3:打印图像
import 'dart:io';
import 'package:image/image.dart';
final ByteData data = await rootBundle.load('assets/logo.png');
final Uint8List bytes = data.buffer.asUint8List();
final Image image = decodeImage(bytes);
// 使用 `ESC *` 命令
generator.image(image);
// 使用 `GS v 0` 命令(已过时)
generator.imageRaster(image);
// 使用 `GS ( L` 命令
generator.imageRaster(image, imageFn: PosImageFn.graphics);
示例 4:打印条形码
final List<int> barData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 4];
generator.barcode(Barcode.upcA(barData));
示例 5:打印二维码
方法 1:使用原生 ESC/POS 命令
generator.qrcode('example.com');
方法 2:将二维码作为图像打印(如果打印机不支持原生命令)
String qrData = "google.com";
const double qrSize = 200;
try {
final uiImg = await QrPainter(
data: qrData,
version: QrVersions.auto,
gapless: false,
).toImageData(qrSize);
final dir = await getTemporaryDirectory();
final pathName = '${dir.path}/qr_tmp.png';
final qrFile = File(pathName);
final imgFile = await qrFile.writeAsBytes(uiImg!.buffer.asUint8List());
final img = decodeImage(imgFile.readAsBytesSync());
generator.image(img);
} catch (e) {
print(e);
}
使用代码表
不同的打印机支持不同的代码表集。某些打印机型号已在 CapabilityProfile
类中定义。因此,如果您想更改默认代码表,请选择正确的配置文件:
// Xprinter XP-N160I
final profile = await CapabilityProfile.load('XP-N160I');
final generator = Generator(PaperSize.mm80, profile);
bytes += generator.setGlobalCodeTable('CP1252');
所有可用的配置文件可以通过以下方式获取:
final profiles = await CapabilityProfile.getAvailableProfiles();
如何帮助
- 添加一个新的
CapabilityProfile
以支持您的打印机型号。新的配置文件应添加到lib/resources/capabilities.json
文件中。 - 测试您的打印机并将其添加到以下列表中:
- 测试并报告问题。
- 分享您关于改进的想法(代码优化、新功能等)。
完整示例代码
以下是完整的示例代码,展示了如何使用 esc_pos_utils_x
插件生成票据并打印。
import 'package:image/image.dart';
import 'dart:typed_data';
import 'package:flutter/services.dart';
import 'package:esc_pos_utils_x/esc_pos_utils_x.dart';
Future<void> main() async {
final profile = await CapabilityProfile.load();
final generator = Generator(PaperSize.mm112, 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: PosStyles(codeTable: 'CP1252'));
bytes += generator.text('Special 2: blåbærgrød',
styles: PosStyles(codeTable: 'CP1252'));
bytes += generator.text('Bold text', styles: PosStyles(bold: true));
bytes += generator.text('Reverse text', styles: PosStyles(reverse: true));
bytes += generator.text('Underlined text',
styles: PosStyles(underline: true), linesAfter: 1);
bytes +=
generator.text('Align left', styles: PosStyles(align: PosAlign.left));
bytes +=
generator.text('Align center', styles: PosStyles(align: PosAlign.center));
bytes += generator.text('Align right',
styles: PosStyles(align: PosAlign.right), linesAfter: 1);
bytes += generator.row([
PosColumn(
text: 'col3',
width: 3,
styles: PosStyles(align: PosAlign.center, underline: true),
),
PosColumn(
text: 'col6',
width: 6,
styles: PosStyles(align: PosAlign.center, underline: true),
),
PosColumn(
text: 'col3',
width: 3,
styles: PosStyles(align: PosAlign.center, underline: true),
),
]);
bytes += generator.text('Text size 200%',
styles: PosStyles(
height: PosTextSize.size2,
width: PosTextSize.size2,
));
// 打印图像:
final ByteData data = await rootBundle.load('assets/logo.png');
final Uint8List imgBytes = data.buffer.asUint8List();
final Image image = decodeImage(imgBytes)!;
bytes += generator.image(image);
// 使用替代命令打印图像(已过时)
// bytes += generator.imageRaster(image);
// 打印条形码
final List<int> barData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 4];
bytes += generator.barcode(Barcode.upcA(barData));
// 打印混合(中文+拉丁字符)文本。仅适用于支持汉字模式的打印机
// ticket.text(
// 'hello ! 中文字 # world @ éphémère &',
// styles: PosStyles(codeTable: PosCodeTable.westEur),
// containsChinese: true,
// );
bytes += generator.feed(2);
bytes += generator.cut();
}
更多关于Flutter蓝牙打印插件esc_pos_utils_x的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter蓝牙打印插件esc_pos_utils_x的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
esc_pos_utils_x
是一个用于 Flutter 的插件,它可以帮助你生成 ESC/POS 打印命令,以便与支持 ESC/POS 协议的蓝牙打印机进行通信。这个插件主要用于生成打印内容,如文本、图像、条形码等,并将其发送到打印机。
以下是如何使用 esc_pos_utils_x
插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 esc_pos_utils_x
插件的依赖:
dependencies:
esc_pos_utils_x: ^1.0.0
然后运行 flutter pub get
来安装依赖。
2. 导入包
在你的 Dart 文件中导入 esc_pos_utils_x
包:
import 'package:esc_pos_utils_x/esc_pos_utils_x.dart';
3. 创建打印内容
使用 Generator
类来生成打印内容。你可以添加文本、图像、条形码等。
final generator = Generator(PaperSize.mm80, await CapabilityProfile.load());
List<int> bytes = [];
// 添加文本
bytes += generator.text('Hello, World!');
bytes += generator.text('This is a test print.', styles: PosStyles(bold: true));
// 添加条形码
bytes += generator.barcode(Barcode.upcA('123456789012'));
// 添加图像
final ByteData data = await rootBundle.load('assets/logo.png');
final Uint8List imageBytes = data.buffer.asUint8List();
final Image image = decodeImage(imageBytes);
bytes += generator.image(image);
// 切纸
bytes += generator.cut();
4. 发送打印数据到蓝牙打印机
你需要使用另一个插件(如 flutter_blue
或 flutter_reactive_ble
)来连接蓝牙打印机并发送打印数据。
以下是一个使用 flutter_blue
的示例:
import 'package:flutter_blue/flutter_blue.dart';
Future<void> printData(List<int> bytes) async {
FlutterBlue flutterBlue = FlutterBlue.instance;
// 扫描设备
flutterBlue.startScan(timeout: Duration(seconds: 4));
// 监听扫描结果
flutterBlue.scanResults.listen((results) {
for (ScanResult result in results) {
if (result.device.name == 'Your Printer Name') {
// 停止扫描
flutterBlue.stopScan();
// 连接设备
result.device.connect().then((_) {
// 发现服务
result.device.discoverServices().then((services) {
for (BluetoothService service in services) {
if (service.uuid.toString() == '000018f0-0000-1000-8000-00805f9b34fb') {
for (BluetoothCharacteristic characteristic in service.characteristics) {
if (characteristic.uuid.toString() == '00002af1-0000-1000-8000-00805f9b34fb') {
// 发送打印数据
characteristic.write(bytes);
}
}
}
}
});
});
}
}
});
}
5. 调用打印函数
最后,调用 printData
函数并传入生成的打印数据:
printData(bytes);