printFormattedText static method
Future<bool>
printFormattedText({
- required List<
TextColumn> columns, - int lineWidth = 48,
- 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 alignmentlineWidth: Width of the line in charactersaddNewLine: 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;
}
}