flutter_jc_printer_plugin/lib/jc_printer.dart
2023-11-28 23:44:09 +08:00

243 lines
6.3 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
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() async {
return _printer.startJob(
blackRules: 0,
paperStyle: 1,
);
}
/// 提交打印任务
///
/// @param data 打印数据。
///
/// @param count 用于指定当前页的打印份数。
Future<bool> commit({
required String data,
int count = 1,
}) async {
return _printer.commit(data: data, count: count);
}
/// 取消打印任务(打印完成之前调用)
Future<bool> cancelPrint() async => _printer.cancelJob();
/// 结束打印任务(打印完成之后调用)
Future<bool> endPrint() async => _printer.endPrint();
}