flutter_printer_plus 0.0.2+2 copy "flutter_printer_plus: ^0.0.2+2" to clipboard
flutter_printer_plus: ^0.0.2+2 copied to clipboard

outdated

flutter 端 【小票、标签】打印能力实现,直接将 flutter widget 转图像数据进行打印。

flutter_printer_plus #

flutter 端 【小票、标签】打印能力实现,直接将 flutter widget 转图像数据进行打印。

支持传输方式:usb连接、网络连接。

结合 print_image_generate_tool 的使用方式 #

1. 使用 PrintImageGenerateWidget 作为根节点


MaterialApp(
          onGenerateTitle: (context) => '打印测试',
          home: Scaffold(
            body: PrintImageGenerateWidget(
              contentBuilder: (context) {
                return const HomePage();
              },
              onPictureGenerated: _onPictureGenerated,
            ),
          ),
        )

2. 在 _onPictureGenerated 方法中监听打印图层生成,并对接打印转码

//打印图层生成成功
  Future<void> _onPictureGenerated(PicGenerateResult data) async {
    final printTask = data.taskItem;

    //指定的打印机
    final printerInfo = printTask.params as PrinterInfo;
    //打印票据类型(标签、小票)
    final printTypeEnum = printTask.printTypeEnum;

    final imageBytes = await data.convertUint8List(imageByteFormat:ImageByteFormat.rawRgba);
    //也可以使用 ImageByteFormat.png
    final argbWidth = data.imageWidth;
    final argbHeight = data.imageHeight;
    if (imageBytes == null) {
      return;
    }
    //只要 imageBytes 不是使用 ImageByteFormat.rawRgba 格式转换的 unit8List
    //argbWidthPx、argbHeightPx 不要传值,默认为空就行
    var printData = await PrinterCommandTool.generatePrintCmd(
      imgData: imageBytes,
      printType: printTypeEnum,
      argbWidthPx: argbWidth,
      argbHeightPx: argbHeight,
    );
    if (printerInfo.isUsbPrinter) {
      // usb 打印
      final conn = UsbConn(printerInfo.usbDevice!);
      conn.writeMultiBytes(printData, 1024 * 3);
    } else if (printerInfo.isNetPrinter) {
      // 网络 打印
      final conn = NetConn(printerInfo.ip!);
      conn.writeMultiBytes(printData);
    }
  }

3. 发送一个任务将flutter - widget转打印图层,生成成功后会在上诉方法中获取到图层

///例如:将 ReceiptStyleWidget 转打印图层
void doPrint() {
  // 生成打印图层任务,指定任务类型为小票
  PictureGeneratorProvider.instance.addPicGeneratorTask(
    PicGenerateTask<PrinterInfo>(
      tempWidget: ReceiptConstrainedBox(ReceiptStyleWidget()) as ATempWidget,
      printTypeEnum: PrintTypeEnum.receipt,
      params: printerInfo,
    ),
  );
}

/// 在 ReceiptStyleWidget 写小票样式
class ReceiptStyleWidget extends StatefulWidget {
  const ReceiptStyleWidget({
    Key? key,
  }) : super(key: key);

  @override
  State<StatefulWidget> createState() => _TempReceiptWidgetState();
}

class _TempReceiptWidgetState extends State<ReceiptStyleWidget> {
  @override
  Widget build(BuildContext context) {
    return _homeBody();
  }

  Widget _homeBody() {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text(
          '测试打印小票',
          style: TextStyle(
            color: Colors.black,
            fontSize: 34.w,
            fontWeight: FontWeight.bold,
          ),
        ),
      ],
    );
  }
}
/// ReceiptConstrainedBox 是小票宽高的限制条件

单独使用 flutter_printer_plus 方式 #

1. 图像数据(Uint8List) 转 TSC 、ESC

第一步:获取 Uint8List
  • 方案一:使用 widget 绘制打印样式,通过 print_image_generate_tool 库,将 widget 转 Uint8List
  • 方案二:通过 path_provider 库,将本地图片转 Uint8List
第二步:转 TSC 、ESC
// 转 TSC 字节,imageBytes 类型为 Uint8List
var printData = await PrinterCommandTool.generatePrintCmd(
        imgData: imageBytes,
        printType: PrintTypeEnum.label,
      );
// 转 ESC 字节,imageBytes 类型为 Uint8List
var printData = await PrinterCommandTool.generatePrintCmd(
        imgData: imageBytes,
        printType: PrintTypeEnum.receipt,
      );

2. 发送打印字节

USB 传输 (USB打印机)

通过 android_usb_printer 库,获取当前已连接的打印机列表,列表内每一个元素类型为 usbDevice。

// usb 打印
        final conn = UsbConn(usbDevice);
        conn.writeMultiBytes(printData, 1024 * 3);
IP 传输(网口打印机)

example 内提供获取局域网内可用打印机样例

// IP 打印
        final conn = NetConn(ip);
        conn.writeMultiBytes(printData);

附注: #

具体实现逻辑可参考 example ,建议使用者将上层进行封装(维护队列),打印图层生成成功后先将图像保存本地,等待上一个打印任务结束后再从队列中获取本地图片进行下一个打印任务,避免造成内存抖动。

方案详细说明链接:flutter:小票标签打印

附上使用该库实现的,小票、标签打印实际效果图:

image.png

image.png

8
likes
0
points
0
downloads

Publisher

unverified uploader

Weekly Downloads

flutter 端 【小票、标签】打印能力实现,直接将 flutter widget 转图像数据进行打印。

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

android_usb_printer, cupertino_icons, esc_utils, flutter, image, isolates, path_provider, print_image_generate_tool, tsc_utils

More

Packages that depend on flutter_printer_plus