From 7159fdb1108cfcbb550da69a5fa7c12272bcf8dc Mon Sep 17 00:00:00 2001 From: reng Date: Tue, 29 Jul 2025 16:45:48 +0800 Subject: [PATCH] update --- src-tauri/src/lib.rs | 86 +++++++++++++++++++++++++++----------------- 1 file changed, 54 insertions(+), 32 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index ce3ef71..382a997 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,39 +1,10 @@ -// use printers::{get_default_printer, get_printers}; -// use printers::common::base::job::PrinterJobOptions; - -// #[tauri::command] -// fn get_all_printers(){ - -// let printers=get_printers(); -// for printer in printers { -// println!("{:?}", printer); -// } -// } - -// #[tauri::command] -// fn print_document(document_path: String) { - -// println!("Printing document: {}", document_path); - -// let default_printer = get_default_printer(); -// if let Some(ref printer) = default_printer { - -// println!("Default Printer: {:?}", printer); - -// let job_id = default_printer.unwrap().print_file(document_path.as_str(), PrinterJobOptions::none()); - -// } else { -// println!("No default printer found."); -// } - -// } use std::collections::HashMap; use std::path::Path; use winprint::printer::{FilePrinter, ImagePrinter, PdfiumPrinter, PrinterDevice}; use winprint::ticket::{ FeatureOptionPackWithPredefined, PredefinedMediaName, PrintCapabilities, PrintTicket, - PrintTicketBuilder, + PrintTicketBuilder,PredefinedPageOutputColor }; #[tauri::command] @@ -92,7 +63,26 @@ fn get_printer_capabilities(device_name: String) -> HashMap> } } } - +fn default_ticket() -> PrintTicket { + // let mut ticket = PrintTicket::new(); + + let xml=r#" + + + + + + + + + + + "#; + let ticket = PrintTicket::from_xml(xml); + ticket +} #[tauri::command] fn print_document(device_name: String, document_path: String, dpi: String, color: String, size: String) { println!("Printing document: {}, {}, {}, {}", document_path, size, dpi, color); @@ -107,16 +97,47 @@ fn print_document(device_name: String, document_path: String, dpi: String, color let capabilities = PrintCapabilities::fetch(&my_device).unwrap(); + // size let parsed_size = size.parse::() .expect("Invalid media size name"); - let a6_media = capabilities .page_media_sizes() .find(|x| x.as_predefined_name() == Some(parsed_size)) .expect("Media size not supported by printer"); + // dpi + let parsed_dpi = dpi + .split('x') + .next() + .and_then(|v| v.parse::().ok()) + .expect("Invalid DPI format"); + let supported_dpi = capabilities + .page_resolutions() + .find(|x| x.dpi() == (parsed_dpi, parsed_dpi)) + .expect("DPI not supported by printer"); + + // color + let parsed_color =capabilities.page_output_colors() + .find(|x| x.as_predefined_name() == Some(color.parse::().unwrap())) + .map(|x| x.as_predefined_name().unwrap()) + .expect("Invalid color name"); + + let supported_color = capabilities + .page_output_colors() + .find(|x| x.as_predefined_name() == Some(parsed_color)) + .expect("Color not supported by printer"); + let mut builder = PrintTicketBuilder::new(&my_device).unwrap(); builder.merge(a6_media).unwrap(); + builder.merge(supported_dpi).unwrap(); + builder.merge(supported_color).unwrap(); + + let default_ticket = default_ticket(); + if let Err(e) = builder.merge(default_ticket) { + println!("Failed to merge default ticket: {:?}", e); + return; + } + let ticket = builder.build().unwrap(); @@ -129,6 +150,7 @@ fn print_document(device_name: String, document_path: String, dpi: String, color let printer=ImagePrinter::new(my_device); printer.print(path, ticket).unwrap(); }; + // let theprinter = PdfiumPrinter::new(my_device); // let theprinter = ImagePrinter::new(my_device); // theprinter.print(path, ticket).unwrap();