A swift library for printing to the cheap “Cat” thermoprinters that can be found on sites such as Aliexpress. I have tested this with the MX10, but I believe that these models will work with this library.
- CYLO BT PRINTER
- MXTP-100
- AZ-P2108X
- MX10 ✅ [confirmed]
- MX11
- BQ02
- EWTTO ET-Z049
Add the repo to your project using SwiftPackage Manager
You need to create an instance of CatPrinter and retain it for the duration of your session.
e.g.
import CatPrint
@MainActor
final class MyViewModel {
let printer = CatPrinter(settings: .default)
}You can then search for a printer with try await printer.startScan(). A bluetoothNotPoweredOn error will be raised if CoreBluetooth is not ready to scan, if you handle this error then you can try again after some time.
func searchForPrinters() async {
do {
try await printer.startScan()
} catch CatPrinterError.bluetoothNotPoweredOn {
try? await Task.sleep(nanoseconds: 1_000_000_000)
await searchForPrinters()
} catch { }
}You can then listen for available cat printers by iterating availablePrintersUpdates. The stream yields the current set immediately, then every subsequent change as printers connect and disconnect.
@MainActor
func observePrinters() async {
for await printers in await printer.availablePrintersUpdates {
guard printers.isEmpty == false else { continue }
state = .foundPrinters(Array(printers))
}
}Finally, once you have a printer you want to print to — you can print by providing a CGImage. The CGImage will automatically be re-sampled to the pixel width of the printer and converted to grayscale. There are some image processing options such as dithering available via the imageProcessing property.
do {
try await printer.printImage(
image, // CGImage
printer: printerInfo
)
} catch CatPrinterError.noSuchPrinterConnected {
} catch CatPrinterError.printerDisconnected {
} catch { }