233 lines
6.1 KiB
Dart
233 lines
6.1 KiB
Dart
import 'dart:async';
|
||
// import 'dart:convert';
|
||
import 'package:jc_printer/constants.dart';
|
||
|
||
import 'jc_printer_platform_interface.dart';
|
||
|
||
enum ConnectState {
|
||
/// 连接中
|
||
connecting,
|
||
|
||
/// 连接成功
|
||
connected,
|
||
|
||
/// 未连接
|
||
none,
|
||
}
|
||
|
||
class JcPrinter {
|
||
final _printer = JcPrinterPlatform.instance;
|
||
// final _font = 'SourceHanSans-Regular.ttc';
|
||
|
||
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);
|
||
}
|
||
|
||
Future<bool> endPrint() async => _printer.endJob();
|
||
}
|