15 stable releases
Uses new Rust 2024
| 2.2.0 | Dec 15, 2025 |
|---|---|
| 2.1.1 | Dec 9, 2025 |
| 1.1.0 | Nov 18, 2025 |
| 1.0.6 | Oct 2, 2024 |
| 1.0.3 | Mar 8, 2024 |
#268 in Hardware support
Used in brother-label
110KB
1.5K
SLoC
brother_ql
This is a crate to convert image data to the Raster Command binary data understood by Brother QL series label printers.
Looking for a CLI tool? Check out brother-label, a command-line application built on this library.
Features
- 📦 Compile to binary data - Convert images to raster command bytes that can be sent to the printer via USB, network, or saved to files
- 🔌 Direct USB printing - Print labels directly via USB connection with full status monitoring (also supported via a kernel connection)
- 📊 Status information - Read detailed printer status including errors, media type, and operational phase
- 🎨 Two-color printing - Support for red and black printing on compatible printer models
- 🏷️ Multiple media types - Support for continuous and die-cut labels in various widths
Supported Printers
See the list of supported printers in the main README.
Note: This crate is still work-in-progress and some bugs might still exist.
For more details, check the official Raster Command Reference (this one is for the 8xx series).
Installation
cargo add brother_ql
# Or with optional features:
cargo add brother_ql --features usb
Feature flags:
usb- Enable USB printing support (requireslibusb)serde- Enable serialization support
Examples
Printing via USB connection
Note: Requires the usb feature.
use brother_ql::{
connection::{PrinterConnection, UsbConnection, UsbConnectionInfo},
media::Media, printer::PrinterModel, printjob::PrintJob,
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create connection info for QL-820NWB
let info = UsbConnectionInfo::from_model(PrinterModel::QL820NWB);
// Open USB connection
let mut connection = UsbConnection::open(info)?;
// Read status from printer
let _status = connection.get_status()?;
// Create a print job with more than one page
let img = image::open("c62.png")?;
let job = PrintJob::new(img, Media::C62)?.page_count(2);
// These are the defaults for the other options:
// .high_dpi(false)
// .compressed(false)
// .quality_priority(true)
// .cut_behavior(CutBehavior::CutEach)?; // default for continuous media
// Finally, print
connection.print(job)?;
Ok(())
}
Printing via kernel connection
Note: Works without any optional features. On Linux, you can use the kernel's USB printer driver (/dev/usb/lp0).
use brother_ql::{
connection::{KernelConnection, PrinterConnection},
media::Media, printjob::PrintJob,
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Open kernel device connection
let mut connection = KernelConnection::open("/dev/usb/lp0")?;
// Create and print a job
let img = image::open("c62.png")?;
let job = PrintJob::new(img, Media::C62)?;
connection.print(job)?;
Ok(())
}
Compiling and saving a print job
Note: Works without any optional features.
use std::{fs::File, io::Write};
use brother_ql::{media::Media, printjob::PrintJob};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let img = image::open("c62.png")?;
let job = PrintJob::new(img, Media::C62)?;
let data = job.compile();
let mut file = File::create("c62mm.bin")?;
file.write_all(&data)?;
Ok(())
}
Dependencies
~15–36MB
~458K SLoC