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 用于指定当前页的打印份数。
|
|
|
|
|
Future<bool> startPrint({
|
|
|
|
|
required String data,
|
|
|
|
|
int count = 1,
|
|
|
|
|
}) async {
|
|
|
|
|
final result = await _printer.startJob(
|
|
|
|
|
blackRules: 0,
|
|
|
|
|
paperStyle: 1,
|
|
|
|
|
);
|
|
|
|
|
if (result != true) return false;
|
|
|
|
|
return _printer.commit(data: data, count: count);
|
|
|
|
|
}
|
2023-10-20 17:45:24 +08:00
|
|
|
|
|
2023-11-25 13:55:51 +08:00
|
|
|
|
/// 取消打印任务
|
|
|
|
|
Future<bool> cancelPrint() async => _printer.cancelJob();
|
|
|
|
|
|
|
|
|
|
/// 结束当前打印任务
|
|
|
|
|
Future<bool> endPrint() async => _printer.endPrint();
|
2023-10-20 13:49:23 +08:00
|
|
|
|
}
|