flutter_jc_printer_plugin/lib/jc_printer.dart

243 lines
6.3 KiB
Dart
Raw Normal View History

2023-10-24 15:20:03 +08:00
import 'dart:async';
// import 'dart:convert';
import 'package:jc_printer/constants.dart';
2023-10-20 13:49:23 +08:00
import 'jc_printer_platform_interface.dart';
2023-10-24 15:20:03 +08:00
enum ConnectState {
/// 连接中
connecting,
/// 连接成功
connected,
/// 未连接
none,
}
2023-10-20 13:49:23 +08:00
class JcPrinter {
2023-10-22 12:31:46 +08:00
final _printer = JcPrinterPlatform.instance;
2023-10-24 15:20:03 +08:00
late final StreamController<ConnectState> _connectStateBroadcast;
late final StreamController<int> _printingCountBroadcast;
late final StreamController<Map<String, String>> _errorInfoBroadcast;
static final JcPrinter _instance = JcPrinter._internal();
factory JcPrinter() => _instance;
JcPrinter._internal() {
_connectStateBroadcast = StreamController.broadcast();
_printingCountBroadcast = StreamController.broadcast();
_errorInfoBroadcast = StreamController.broadcast();
_printer.printerStream.listen(_listener);
}
Stream<ConnectState> get connectStateStream => _connectStateBroadcast.stream;
Stream<int> get printingCountStream => _printingCountBroadcast.stream;
Stream<Map<String, String>> get errorInfoStream => _errorInfoBroadcast.stream;
void _listener(dynamic event) {
if (event is! Map) return;
if (event['type'] == 'connectState') _connectStateListener(event);
if (event['type'] == 'printingCount') _printingCountListener(event);
if (event['type'] == 'errorInfo') _errorInfoListener(event);
}
void _connectStateListener(dynamic event) {
_connectStateBroadcast.sink.add(
event['result'] == true ? ConnectState.connected : ConnectState.none,
);
}
void _printingCountListener(dynamic event) {
if (event['result'] is! Map) return;
final result = event['result'];
final count = int.tryParse(result['totalCount'].toString()) ?? 0;
_printingCountBroadcast.sink.add(count);
}
void _errorInfoListener(dynamic event) {
final code = event['result'].toString();
final msg = kErrorInfo[code] ?? '';
_errorInfoBroadcast.sink.add({'code': code, 'msg': msg});
}
void connect(String name) {
_connectStateBroadcast.sink.add(ConnectState.connecting);
_printer.connect(name);
}
void disconnect() {
_printer.disconnect();
}
void setTotalPrints(int count) => _printer.setTotalPrints(count);
/// 初始化画板。
///
/// @param width 画布宽度单位mm。
///
/// @param height 画布高度单位mm。
///
/// @param font 使用字体路径。
Future<void> initDrawingBoard({
required double width,
required double height,
required String font,
}) async {
return _printer.initDrawingBoard(width: width, height: height, font: font);
}
/// 绘制文本。
///
/// @param x 水平坐标单位mm。
///
/// @param y 垂直坐标单位mm。
///
/// @param width 图片宽度单位mm。
///
/// @param height 图片高度单位mm。
///
/// @param content 内容。
///
/// @param rotate 旋转角度支持角度0/90/180/270。
///
/// @param textAlignHorizontal 文本水平对齐方式 0 左对齐、1 水平居中对齐、2 右对齐。
///
/// @param textAlignVertical 文本竖直对齐方式 0 上对齐、1 垂直居中对齐、2 下对齐。
///
/// @param lineMode 换行方式
/// 1:宽高固定,内容大小自适应(字号/字符间距/行间距 按比例缩放)
/// 2:宽度固定,高度自适应
/// 6.宽高固定,内容超过预设的宽高时自动缩小。
///
/// @param letterSpacing 字体间隔。
///
/// @param lineSpacing 行间隔。
Future<void> drawLabelText({
required double width,
required double height,
required String content,
required double fontSize,
double x = 0,
double y = 0,
int rotate = 0,
int textAlignHorizontal = 0,
int textAlignVertical = 0,
int lineMode = 1,
double letterSpacing = 0,
double lineSpacing = 0,
}) async {
await _printer.drawLabelText(
x: x,
y: y,
width: width,
height: height,
content: content,
fontSize: fontSize,
rotate: rotate,
textAlignHorizontal: textAlignHorizontal,
textAlignVertical: textAlignVertical,
lineMode: lineMode,
letterSpacing: letterSpacing,
lineSpacing: lineSpacing,
);
}
/// 绘制条码。
///
/// @param x 水平坐标单位mm。
///
/// @param y 垂直坐标单位mm。
///
/// @param width 图片宽度单位mm。
///
/// @param height 图片高度单位mm。
///
/// @param text 内容。
///
/// @param fontSize 字体大小。
///
/// @param rotate 旋转角度支持角度0/90/180/270。
///
/// @param textHeight 文本高度单位mm。
///
/// @param textPosition 文本位置,一维码文字识别码显示位置
/// 0:下方显示
/// 1:上方显示
/// 2:不显示。
///
/// @param codeType 一维码类型
/// 20:CODE128
/// 21:UPC-A
/// 22:UPC-E
/// 23:EAN8
/// 24:EAN13
/// 25:CODE93
/// 26:CODE39
/// 27:CODEBAR
/// 28:ITF25。
Future<void> drawLabelBarcode({
required double width,
required double height,
required String text,
required double fontSize,
required double textHeight,
double x = 0,
double y = 0,
int rotate = 0,
int codeType = 20,
int textPosition = 0,
}) async {
await _printer.drawLabelBarcode(
x: x,
y: y,
width: width,
height: height,
text: text,
fontSize: fontSize,
rotate: rotate,
textHeight: textHeight,
codeType: codeType,
textPosition: textPosition,
);
}
/// 获取绘画数据
Future<String> getLabelData() async => _printer.getLabelData();
/// 开始打印
///
/// @param data 绘画数据。
///
/// @param count 用于指定当前页的打印份数。
2023-11-28 23:44:09 +08:00
Future<bool> startPrint() async {
return _printer.startJob(
2023-10-24 15:20:03 +08:00
blackRules: 0,
paperStyle: 1,
);
2023-11-28 23:44:09 +08:00
}
/// 提交打印任务
///
/// @param data 打印数据。
///
/// @param count 用于指定当前页的打印份数。
Future<bool> commit({
required String data,
int count = 1,
}) async {
2023-10-24 15:20:03 +08:00
return _printer.commit(data: data, count: count);
}
2023-10-20 17:45:24 +08:00
2023-11-28 23:44:09 +08:00
/// 取消打印任务(打印完成之前调用)
2023-11-25 13:55:51 +08:00
Future<bool> cancelPrint() async => _printer.cancelJob();
2023-11-28 23:44:09 +08:00
/// 结束打印任务(打印完成之后调用)
2023-11-25 13:55:51 +08:00
Future<bool> endPrint() async => _printer.endPrint();
2023-10-20 13:49:23 +08:00
}