printFormattedText static method

Future<bool> printFormattedText({
  1. required List<TextColumn> columns,
  2. int lineWidth = 48,
  3. bool addNewLine = true,
})

Print formatted text directly to the printer without converting to an image.

This is more efficient for printing text that contains only ASCII characters.

  • columns: List of text columns with position and alignment
  • lineWidth: Width of the line in characters
  • addNewLine: Whether to add a newline at the end

Returns true if printing was successful.

Implementation

static Future<bool> printFormattedText({
  required List<TextColumn> columns,
  int lineWidth =
      48, // Standard 48 characters per line for most receipt printers
  bool addNewLine = true,
}) async {
  try {
    // Sort columns by x position
    final sortedColumns = List<TextColumn>.from(columns)
      ..sort((a, b) => a.x.compareTo(b.x));

    // Convert x positions to character positions
    List<FormattedColumn> formattedColumns = [];

    for (int i = 0; i < sortedColumns.length; i++) {
      final col = sortedColumns[i];

      // Convert x position to character position (approximately)
      int charPosition = (col.x * lineWidth / 576).round();

      // Calculate the available width for this column
      int availableWidth;
      if (i < sortedColumns.length - 1) {
        // Space until the next column
        int nextCharPos = (sortedColumns[i + 1].x * lineWidth / 576).round();
        availableWidth = nextCharPos - charPosition;
      } else {
        // Space until the end of the line
        availableWidth = lineWidth - charPosition;
      }

      // Ensure minimum width
      availableWidth = math.max(availableWidth, 1);

      formattedColumns.add(FormattedColumn(
        text: col.text,
        charPosition: charPosition,
        width: availableWidth,
        align: col.align,
      ));
    }

    // Format the line
    String formattedLine =
        TextFormatter.formatTextLine(formattedColumns, lineWidth);

    // Add newline if requested
    if (addNewLine) {
      formattedLine += '\n';
    }

    // Send to printer
    return await printText(formattedLine);
  } catch (e) {
    print('Error in printFormattedText: $e');
    return false;
  }
}