printData method

Future<void> printData(
  1. Printer printer,
  2. List<int> bytes, {
  3. bool longData = false,
  4. int? chunkSize,
})

Print data to printer device

Implementation

Future<void> printData(
  Printer printer,
  List<int> bytes, {
  bool longData = false,
  int? chunkSize,
}) async {
  if (printer.connectionType == ConnectionType.USB) {
    if (Platform.isWindows) {
      // Windows USB printing using Win32 API
      using((alloc) {
        RawPrinter(printer.name!, alloc).printEscPosWin32(bytes);
      });
      return;
    } else {
      // Non-Windows USB printing
      try {
        await FlutterThermalPrinterPlatform.instance.printText(
          printer,
          Uint8List.fromList(bytes),
          path: printer.address,
        );
      } catch (e) {
        log('FlutterThermalPrinter: Unable to Print Data $e');
      }
    }
  } else if (printer.connectionType == ConnectionType.BLE) {
    try {
      final services = await printer.discoverServices();

      BleCharacteristic? writeCharacteristic;
      for (final service in services) {
        for (final characteristic in service.characteristics) {
          if (characteristic.properties.contains(
            CharacteristicProperty.write,
          )) {
            writeCharacteristic = characteristic;
            break;
          }
        }
      }

      if (writeCharacteristic == null) {
        log('No write characteristic found');
        return;
      }
      final mtu = chunkSize ??
          (Platform.isWindows
              ? 50
              : await printer.requestMtu(Platform.isMacOS ? 150 : 500));
      final maxChunkSize = mtu - 3;

      for (var i = 0; i < bytes.length; i += maxChunkSize) {
        final chunk = bytes.sublist(
          i,
          i + maxChunkSize > bytes.length ? bytes.length : i + maxChunkSize,
        );

        await writeCharacteristic.write(
          Uint8List.fromList(chunk),
        );

        // Small delay between chunks to avoid overwhelming the device
        if (longData) {
          await Future.delayed(const Duration(milliseconds: 10));
        }
      }
      return;
    } catch (e) {
      log('Failed to print data to device $e');
    }
  }
}