Commit: bc868d2
Parent: ca7cd45

Factor out ESCPOS printing

Mårten Åsberg committed on 2026-03-19 at 19:17
src/escpos_printer.rs +34 -0
diff --git a/src/escpos_printer.rs b/src/escpos_printer.rs
new file mode 100644
index 0000000..82eccab
@@ -0,0 +1,34 @@
use escpos::{
driver::NetworkDriver,
errors::PrinterError,
printer::Printer,
utils::{BitImageOption, BitImageSize, Protocol},
};
pub struct EscposPrinter {
printer: Printer<NetworkDriver>,
}
impl EscposPrinter {
pub const IMAGE_WIDTH_PIXEL: u32 = 72 * 8;
pub const IMAGE_WIDTH_CM: f32 = 7.2;
pub const IMAGE_WIDTH_PT: f32 = Self::IMAGE_WIDTH_CM / 0.03527;
pub const IMAGE_PIXELS_PER_PT: f32 = Self::IMAGE_WIDTH_PIXEL as f32 / Self::IMAGE_WIDTH_PT;
pub fn open(host: &str, port: u16) -> Result<Self, PrinterError> {
let driver = NetworkDriver::open(host, port, None)?;
Ok(Self {
printer: Printer::new(driver, Protocol::default(), None),
})
}
pub fn print_image(&mut self, image: &[u8]) -> Result<(), PrinterError> {
self.printer.init()?;
self.printer.bit_image_from_bytes_option(
image,
BitImageOption::new(Some(Self::IMAGE_WIDTH_PIXEL), None, BitImageSize::Normal)?,
)?;
self.printer.print_cut()?;
Ok(())
}
}
src/main.rs +1 -0
diff --git a/src/main.rs b/src/main.rs
index 679271a..510fb3c 100644
@@ -1,3 +1,4 @@
mod escpos_printer;
mod proto;
mod receipt_printer_service;
src/receipt_printer_service.rs +5 -32
diff --git a/src/receipt_printer_service.rs b/src/receipt_printer_service.rs
index 71a176f..8061b50 100644
@@ -1,14 +1,10 @@
use std::time::Duration;
use escpos::driver::NetworkDriver;
use escpos::printer::Printer;
use escpos::utils::{BitImageOption, BitImageSize, Protocol};
use tonic::{Request, Response, Status};
use typst::foundations::{Dict, IntoValue};
use typst::layout::PagedDocument;
use typst_as_lib::TypstEngine;
use typst_as_lib::typst_kit_options::TypstKitFontOptions;
use crate::escpos_printer::EscposPrinter;
use crate::proto::print_request::Content;
use crate::proto::receipt_printer_server::ReceiptPrinter;
use crate::proto::{PrintRequest, PrintResponse, TypstContent};
@@ -63,13 +59,8 @@ impl ReceiptPrinter for ReceiptPrinterService {
}
};
let width_pixel = 72 * 8;
let width_cm = 7.2;
let width_pt = width_cm / 0.03527;
let pixel_per_pt = width_pixel as f32 / width_pt;
println!("Rendering document...");
let pixmap = typst_render::render(&document.pages[0], pixel_per_pt);
let pixmap = typst_render::render(&document.pages[0], EscposPrinter::IMAGE_PIXELS_PER_PT);
println!("Pixel size: {}x{}", pixmap.width(), pixmap.height());
let png = match pixmap.encode_png() {
Ok(png) => png,
@@ -80,33 +71,15 @@ impl ReceiptPrinter for ReceiptPrinterService {
};
println!("Connecting to printer...");
let driver = match NetworkDriver::open(
self.printer_host.as_ref(),
self.printer_port,
Some(Duration::from_secs(5)),
) {
Ok(driver) => driver,
let mut printer = match EscposPrinter::open(self.printer_host.as_ref(), self.printer_port) {
Ok(printer) => printer,
Err(error) => {
println!("Error connecting to printer: {error}");
return Ok(Response::new(PrintResponse::default()));
}
};
println!("Initializing printer...");
let mut printer = Printer::new(driver, Protocol::default(), None);
if let Err(error) = printer.init() {
println!("Error initializing printer: {error}");
return Ok(Response::new(PrintResponse::default()));
}
println!("Sending image to printer...");
if let Err(error) = printer.bit_image_from_bytes_option(
&png,
BitImageOption::new(Some(width_pixel), None, BitImageSize::Normal).unwrap(),
) {
println!("Error when printing document: {error}");
return Ok(Response::new(PrintResponse::default()));
}
println!("Printing...");
if let Err(error) = printer.print_cut() {
if let Err(error) = printer.print_image(&png) {
println!("Error when printing: {error}");
return Ok(Response::new(PrintResponse::default()));
}