Flutter打印小票插件esc_pos_utils_appzap的使用
esc_pos_utils_appzap
esc_pos_utils_appzap
是一个用于生成 ESC/POS 打印命令的基础库。Generator
类可以生成 ESC/POS 命令,并将其发送到热敏打印机。
此库被用作以下项目的底层支持:
- Flutter WiFi/Ethernet 打印: esc_pos_printer
- Flutter 蓝牙打印: esc_pos_bluetooth
主要功能
- 连接到 Wi-Fi/以太网打印机
- 使用
text
方法进行简单文本打印 - 使用
row
方法打印表格 - 文本样式:
- 大小、对齐方式、加粗、反向、下划线、不同字体、旋转 90°
- 打印图像
- 打印条形码(支持 UPC-A, UPC-E, JAN13 (EAN13), JAN8 (EAN8), CODE39, ITF, CODABAR, CODE128 等)
- 纸张切割(部分切割、完全切割)
- 发出蜂鸣声(不同持续时间)
- 纸张进纸、退纸
注意:您的打印机可能不支持所有列出的功能(如某些样式、部分/完全纸张切割、退纸、条形码等)。
生成小票
简单带样式的票据
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;
}
打印表格行
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),
),
]);
打印图像
该包实现了三种 ESC/POS 函数:
<code>ESC *</code>
- 列格式打印<code>GS v 0</code>
- 位图格式打印(已过时)<code>GS ( L</code>
- 位图格式打印
注意:您的打印机可能只支持其中的一些函数。
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);
打印条形码
final List<int> barData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 4];
generator.barcode(Barcode.upcA(barData));
打印二维码
使用原生 ESC/POS 命令
generator.qrcode('example.com');
将二维码作为图像打印(如果打印机不支持原生命令)
在 pubspec.yaml
文件中添加依赖项:
dependencies:
qr_flutter: ^4.0.0
path_provider: ^2.0.9
代码示例:
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
文件中。 - 测试您的打印机并在表格中添加它:
- 测试并报告错误
- 分享您对改进的看法(代码优化、新功能等)
完整示例代码
import 'package:esc_pos_utils_appzap/esc_pos_utils_appzap.dart';
import 'package:image/image.dart';
import 'dart:typed_data';
import 'package:flutter/services.dart';
Future<void> main() 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: 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);
// 打印条形码
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();
}
更多关于Flutter打印小票插件esc_pos_utils_appzap的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter打印小票插件esc_pos_utils_appzap的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
esc_pos_utils
是一个用于生成 ESC/POS 命令的 Flutter 插件,通常用于打印小票。它可以帮助你生成适用于热敏打印机的命令,并将这些命令发送到打印机进行打印。esc_pos_utils_appzap
是 esc_pos_utils
的一个扩展或变体,可能包含一些额外的功能或优化。
以下是如何在 Flutter 项目中使用 esc_pos_utils
插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 esc_pos_utils
插件的依赖:
dependencies:
flutter:
sdk: flutter
esc_pos_utils: ^1.0.0 # 请检查最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入包
在你的 Dart 文件中导入 esc_pos_utils
包:
import 'package:esc_pos_utils/esc_pos_utils.dart';
3. 生成 ESC/POS 命令
你可以使用 Generator
类来生成 ESC/POS 命令。以下是一个简单的示例:
void printReceipt() {
// 创建一个 Generator 实例
final generator = Generator(PaperSize.mm80, await CapabilityProfile.load());
// 生成小票内容
List<int> bytes = [];
bytes += generator.reset();
bytes += generator.text('Hello, World!');
bytes += generator.text('This is a test receipt.',
styles: PosStyles(align: PosAlign.center));
bytes += generator.text('Thank you!',
styles: PosStyles(bold: true, align: PosAlign.center));
bytes += generator.cut();
// 将生成的命令发送到打印机
// 这里需要根据你的打印机类型和连接方式来实现
// 例如,使用蓝牙、Wi-Fi 或 USB 连接打印机
// 以下是一个伪代码示例:
// printerConnection.send(bytes);
}
4. 连接打印机
esc_pos_utils
只负责生成 ESC/POS 命令,你需要使用其他插件或方法来连接打印机并发送这些命令。常见的连接方式包括:
- 蓝牙: 使用
flutter_blue
或flutter_reactive_ble
插件。 - Wi-Fi: 使用
http
或dio
插件通过 TCP/IP 连接打印机。 - USB: 使用
flutter_usb_printer
插件。
5. 发送打印命令
根据你选择的连接方式,将生成的 bytes
发送到打印机。以下是一个使用蓝牙连接的示例:
import 'package:flutter_blue/flutter_blue.dart';
void sendToPrinter(List<int> bytes) async {
FlutterBlue flutterBlue = FlutterBlue.instance;
// 扫描并连接打印机
// 这里假设你已经知道打印机的蓝牙地址
BluetoothDevice printer = await flutterBlue.connect(BluetoothDevice(
id: DeviceIdentifier('XX:XX:XX:XX:XX:XX'),
name: 'Printer',
type: BluetoothDeviceType.unknown,
));
// 找到打印服务
List<BluetoothService> services = await printer.discoverServices();
BluetoothService service = services.firstWhere(
(s) => s.uuid.toString() == '00001101-0000-1000-8000-00805f9b34fb',
);
// 找到打印特征
BluetoothCharacteristic characteristic = service.characteristics.firstWhere(
(c) => c.uuid.toString() == '00002a00-0000-1000-8000-00805f9b34fb',
);
// 发送打印命令
await characteristic.write(bytes);
}