Flutter打印功能插件flutter_printer_plus的使用

flutter端【小票、标签】打印能力实现,支持USB、网口,支持Android、Windows平台。(无厂家SDK嵌入)

结合print_image_generate_tool库可直接使用flutter-widget布局进行打印票据的样式开发,widget怎么写,打印出来的样式就是什么。

使用方式一:单独使用flutter_printer_plus方式

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

第一步:获取Uint8List

方案一
使用widget绘制打印样式,通过print_image_generate_tool库,将widget转Uint8List(参考使用方式二,或直接查看example中使用方式)。

方案二
通过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打印机列表
搜索已连接(Android)/已安装驱动的(Windows)USB打印机。

// 返回 Future<List<UsbDeviceInfo>>
FlutterPrinterFinder.queryUsbPrinter()

提供能力获取网络打印机列表

// 返回 Future<List<String>>
FlutterPrinterFinder.queryPrinterIp()

3. 发送打印字节

USB传输(USB打印机)

// USB打印
final conn = UsbConn(usbDevice);
conn.writeMultiBytes(printData, 1024 * 3);

IP传输(网口打印机) example内提供获取局域网内可用打印机样例。

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

使用方式二:结合print_image_generate_tool的使用方式

直接将flutter widget转图像数据进行打印。

第一步:使用PrintImageGenerateWidget作为根节点

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

第二步:在_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);
  }
}

第三步:发送一个任务将flutter - widget转打印图层,生成成功后会在上述方法中获取到图层

/// 例如:将 ReceiptStyleWidget 转打印图层
void doPrint() {
  // 生成打印图层任务,指定任务类型为小票
  PictureGeneratorProvider.instance.addPicGeneratorTask(
    PicGenerateTask<PrinterInfo>(
      tempWidget: ReceiptConstrainedBox(ReceiptStyleWidget()) as ATempWidget, // ReceiptConstrainedBox封装了小票宽高的限制条件
      printTypeEnum: PrintTypeEnum.receipt,
      params: printerInfo, // params是一个透传值,可以是任意类型,example中 params携带的是打印机数据,在 _onPictureGenerated 中跟随生成的打印图层可被获取到
    ),
  );
}

/// 使用widget编写需要的小票样式,以下是样例
class ReceiptStyleWidget extends StatefulWidget {
  const ReceiptStyleWidget({
    Key? key,
  }) : super(key: key);

  [@override](/user/override)
  State<StatefulWidget> createState() => _TempReceiptWidgetState();
}

class _TempReceiptWidgetState extends State<ReceiptStyleWidget> {
  [@override](/user/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,
          ),
        ),
      ],
    );
  }
}
1 回复

更多关于Flutter打印功能插件flutter_printer_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_printer_plus 是一个用于在 Flutter 应用中实现打印功能的插件。它支持多种打印方式,包括蓝牙打印、网络打印和 USB 打印。以下是如何使用 flutter_printer_plus 插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 flutter_printer_plus 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_printer_plus: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入插件

在你的 Dart 文件中导入 flutter_printer_plus 插件:

import 'package:flutter_printer_plus/flutter_printer_plus.dart';

3. 初始化插件

在使用插件之前,通常需要先进行初始化:

void initPrinter() async {
  await FlutterPrinterPlus.init();
}

4. 搜索打印机

你可以通过蓝牙、网络或 USB 搜索打印机:

void searchPrinters() async {
  List<PrinterDevice> printers = await FlutterPrinterPlus.searchPrinters();
  printers.forEach((printer) {
    print('Printer: ${printer.name}, Address: ${printer.address}');
  });
}

5. 连接打印机

选择要连接的打印机并建立连接:

void connectPrinter(PrinterDevice printer) async {
  bool isConnected = await FlutterPrinterPlus.connect(printer);
  if (isConnected) {
    print('Connected to printer: ${printer.name}');
  } else {
    print('Failed to connect to printer: ${printer.name}');
  }
}

6. 打印文本

连接成功后,你可以发送打印任务:

void printText(String text) async {
  bool isPrinted = await FlutterPrinterPlus.printText(text);
  if (isPrinted) {
    print('Text printed successfully');
  } else {
    print('Failed to print text');
  }
}

7. 打印图片

你也可以打印图片:

void printImage(String imagePath) async {
  bool isPrinted = await FlutterPrinterPlus.printImage(imagePath);
  if (isPrinted) {
    print('Image printed successfully');
  } else {
    print('Failed to print image');
  }
}

8. 断开连接

打印完成后,记得断开与打印机的连接:

void disconnectPrinter() async {
  await FlutterPrinterPlus.disconnect();
  print('Printer disconnected');
}

9. 处理权限

在某些情况下,你可能需要请求蓝牙或存储权限。确保在 AndroidManifest.xmlInfo.plist 中添加必要的权限声明。

10. 示例代码

以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:flutter_printer_plus/flutter_printer_plus.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PrinterScreen(),
    );
  }
}

class PrinterScreen extends StatefulWidget {
  [@override](/user/override)
  _PrinterScreenState createState() => _PrinterScreenState();
}

class _PrinterScreenState extends State<PrinterScreen> {
  List<PrinterDevice> printers = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    initPrinter();
  }

  void initPrinter() async {
    await FlutterPrinterPlus.init();
  }

  void searchPrinters() async {
    List<PrinterDevice> foundPrinters = await FlutterPrinterPlus.searchPrinters();
    setState(() {
      printers = foundPrinters;
    });
  }

  void connectPrinter(PrinterDevice printer) async {
    bool isConnected = await FlutterPrinterPlus.connect(printer);
    if (isConnected) {
      print('Connected to printer: ${printer.name}');
    } else {
      print('Failed to connect to printer: ${printer.name}');
    }
  }

  void printText(String text) async {
    bool isPrinted = await FlutterPrinterPlus.printText(text);
    if (isPrinted) {
      print('Text printed successfully');
    } else {
      print('Failed to print text');
    }
  }

  void disconnectPrinter() async {
    await FlutterPrinterPlus.disconnect();
    print('Printer disconnected');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Printer Example'),
      ),
      body: Column(
        children: [
          ElevatedButton(
            onPressed: searchPrinters,
            child: Text('Search Printers'),
          ),
          Expanded(
            child: ListView.builder(
              itemCount: printers.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(printers[index].name),
                  subtitle: Text(printers[index].address),
                  onTap: () => connectPrinter(printers[index]),
                );
              },
            ),
          ),
          ElevatedButton(
            onPressed: () => printText('Hello, World!'),
            child: Text('Print Text'),
          ),
          ElevatedButton(
            onPressed: disconnectPrinter,
            child: Text('Disconnect Printer'),
          ),
        ],
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!