|
|
|
@ -3,10 +3,13 @@ use std::path::Path; |
|
|
|
|
|
|
|
|
|
|
|
use winprint::printer::{FilePrinter, ImagePrinter, PdfiumPrinter, PrinterDevice}; |
|
|
|
use winprint::printer::{FilePrinter, ImagePrinter, PdfiumPrinter, PrinterDevice}; |
|
|
|
use winprint::ticket::{ |
|
|
|
use winprint::ticket::{ |
|
|
|
FeatureOptionPackWithPredefined, PredefinedMediaName, PrintCapabilities, PrintTicket, |
|
|
|
FeatureOptionPackWithPredefined, PredefinedMediaName, PredefinedPageOutputColor, |
|
|
|
PrintTicketBuilder,PredefinedPageOutputColor |
|
|
|
PrintCapabilities, PrintTicket, PrintTicketBuilder, |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// use util::imageToPdf;
|
|
|
|
|
|
|
|
mod util; |
|
|
|
|
|
|
|
|
|
|
|
#[tauri::command] |
|
|
|
#[tauri::command] |
|
|
|
fn get_all_printers() -> Vec<String> { |
|
|
|
fn get_all_printers() -> Vec<String> { |
|
|
|
let printers = PrinterDevice::all().expect("Failed to get printers"); |
|
|
|
let printers = PrinterDevice::all().expect("Failed to get printers"); |
|
|
|
@ -31,6 +34,18 @@ fn get_printer_capabilities(device_name: String) -> HashMap<String, Vec<String>> |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
println!("My Printer: {:?}", my_device.name()); |
|
|
|
println!("My Printer: {:?}", my_device.name()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
match PrintCapabilities::fetch_xml(&my_device) { |
|
|
|
|
|
|
|
Ok(xml) => { |
|
|
|
|
|
|
|
println!("Printer Capabilities fetched successfully."); |
|
|
|
|
|
|
|
let string_xml = String::from_utf8_lossy(&xml).to_string(); |
|
|
|
|
|
|
|
println!("Printer Capabilities XML: {}", string_xml); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
Err(e) => { |
|
|
|
|
|
|
|
println!("Failed to fetch capabilities: {:?}", e); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
match PrintCapabilities::fetch(&my_device) { |
|
|
|
match PrintCapabilities::fetch(&my_device) { |
|
|
|
Ok(capabilities) => { |
|
|
|
Ok(capabilities) => { |
|
|
|
let dpi_opts = capabilities.page_resolutions(); |
|
|
|
let dpi_opts = capabilities.page_resolutions(); |
|
|
|
@ -66,26 +81,42 @@ fn get_printer_capabilities(device_name: String) -> HashMap<String, Vec<String>> |
|
|
|
fn default_ticket() -> PrintTicket { |
|
|
|
fn default_ticket() -> PrintTicket { |
|
|
|
// let mut ticket = PrintTicket::new();
|
|
|
|
// let mut ticket = PrintTicket::new();
|
|
|
|
|
|
|
|
|
|
|
|
let xml=r#"<?xml version="1.0" encoding="UTF-8"?> |
|
|
|
let xml = r#"<?xml version="1.0" encoding="UTF-8"?> |
|
|
|
<psf:PrintTicket version="1" |
|
|
|
<psf:PrintTicket version="1" |
|
|
|
xmlns:psf="http://schemas.microsoft.com/windows/2003/08/printing/printschemaframework" |
|
|
|
xmlns:psf="http://schemas.microsoft.com/windows/2003/08/printing/printschemaframework" |
|
|
|
xmlns:psk="http://schemas.microsoft.com/windows/2003/08/printing/printschemakeywords"> |
|
|
|
xmlns:psk="http://schemas.microsoft.com/windows/2003/08/printing/printschemakeywords"> |
|
|
|
|
|
|
|
|
|
|
|
<psf:Feature name="psk:PageScaling"> |
|
|
|
<psf:Feature name="psk:PageScaling"> |
|
|
|
<psf:Option name="psk:FitToPage" /> |
|
|
|
<psf:Option name="psk:PageScalingFit"/> |
|
|
|
</psf:Feature> |
|
|
|
</psf:Feature> |
|
|
|
|
|
|
|
|
|
|
|
<psf:Feature name="psk:PageOutputQuality"> |
|
|
|
<psf:Feature name="psk:PageOutputQuality"> |
|
|
|
<psf:Option name="psk:High" /> |
|
|
|
<psf:Option name="psk:High" /> |
|
|
|
</psf:Feature> |
|
|
|
</psf:Feature> |
|
|
|
|
|
|
|
<psf:Feature name="psk:PageMediaSize"> |
|
|
|
|
|
|
|
<psf:Option name="psk:PageMediaSizeA6"/> |
|
|
|
|
|
|
|
</psf:Feature> |
|
|
|
|
|
|
|
<psf:Feature name="psk:PageOutputColor"> |
|
|
|
|
|
|
|
<psf:Option name="psk:Monochrome"/> |
|
|
|
|
|
|
|
</psf:Feature> |
|
|
|
</psf:PrintTicket>"#; |
|
|
|
</psf:PrintTicket>"#; |
|
|
|
let ticket = PrintTicket::from_xml(xml); |
|
|
|
let ticket = PrintTicket::from_xml(xml); |
|
|
|
ticket |
|
|
|
ticket |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#[tauri::command] |
|
|
|
#[tauri::command] |
|
|
|
fn print_document(device_name: String, document_path: String, dpi: String, color: String, size: String) { |
|
|
|
fn print_document( |
|
|
|
println!("Printing document: {}, {}, {}, {}", document_path, size, dpi, color); |
|
|
|
device_name: String, |
|
|
|
|
|
|
|
document_path: String, |
|
|
|
|
|
|
|
dpi: String, |
|
|
|
|
|
|
|
color: String, |
|
|
|
|
|
|
|
size: String, |
|
|
|
|
|
|
|
) { |
|
|
|
|
|
|
|
println!( |
|
|
|
|
|
|
|
"Printing document: {}, {}, {}, {}", |
|
|
|
|
|
|
|
document_path, size, dpi, color |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
let my_device = match get_my_device(device_name.clone()) { |
|
|
|
let my_device = match get_my_device(device_name.clone()) { |
|
|
|
Some(device) => device, |
|
|
|
Some(device) => device, |
|
|
|
None => { |
|
|
|
None => { |
|
|
|
@ -98,12 +129,13 @@ fn print_document(device_name: String, document_path: String, dpi: String, color |
|
|
|
let capabilities = PrintCapabilities::fetch(&my_device).unwrap(); |
|
|
|
let capabilities = PrintCapabilities::fetch(&my_device).unwrap(); |
|
|
|
|
|
|
|
|
|
|
|
// size
|
|
|
|
// size
|
|
|
|
let parsed_size = size.parse::<PredefinedMediaName>() |
|
|
|
let parsed_size = size |
|
|
|
.expect("Invalid media size name"); |
|
|
|
.parse::<PredefinedMediaName>() |
|
|
|
|
|
|
|
.expect("Invalid media size name"); |
|
|
|
let a6_media = capabilities |
|
|
|
let a6_media = capabilities |
|
|
|
.page_media_sizes() |
|
|
|
.page_media_sizes() |
|
|
|
.find(|x| x.as_predefined_name() == Some(parsed_size)) |
|
|
|
.find(|x| x.as_predefined_name() == Some(parsed_size)) |
|
|
|
.expect("Media size not supported by printer"); |
|
|
|
.expect("Media size not supported by printer"); |
|
|
|
|
|
|
|
|
|
|
|
// dpi
|
|
|
|
// dpi
|
|
|
|
let parsed_dpi = dpi |
|
|
|
let parsed_dpi = dpi |
|
|
|
@ -117,11 +149,14 @@ fn print_document(device_name: String, document_path: String, dpi: String, color |
|
|
|
.expect("DPI not supported by printer"); |
|
|
|
.expect("DPI not supported by printer"); |
|
|
|
|
|
|
|
|
|
|
|
// color
|
|
|
|
// color
|
|
|
|
let parsed_color =capabilities.page_output_colors() |
|
|
|
let parsed_color = capabilities |
|
|
|
.find(|x| x.as_predefined_name() == Some(color.parse::<PredefinedPageOutputColor>().unwrap())) |
|
|
|
.page_output_colors() |
|
|
|
|
|
|
|
.find(|x| { |
|
|
|
|
|
|
|
x.as_predefined_name() == Some(color.parse::<PredefinedPageOutputColor>().unwrap()) |
|
|
|
|
|
|
|
}) |
|
|
|
.map(|x| x.as_predefined_name().unwrap()) |
|
|
|
.map(|x| x.as_predefined_name().unwrap()) |
|
|
|
.expect("Invalid color name"); |
|
|
|
.expect("Invalid color name"); |
|
|
|
|
|
|
|
|
|
|
|
let supported_color = capabilities |
|
|
|
let supported_color = capabilities |
|
|
|
.page_output_colors() |
|
|
|
.page_output_colors() |
|
|
|
.find(|x| x.as_predefined_name() == Some(parsed_color)) |
|
|
|
.find(|x| x.as_predefined_name() == Some(parsed_color)) |
|
|
|
@ -132,32 +167,50 @@ fn print_document(device_name: String, document_path: String, dpi: String, color |
|
|
|
builder.merge(supported_dpi).unwrap(); |
|
|
|
builder.merge(supported_dpi).unwrap(); |
|
|
|
builder.merge(supported_color).unwrap(); |
|
|
|
builder.merge(supported_color).unwrap(); |
|
|
|
|
|
|
|
|
|
|
|
let default_ticket = default_ticket(); |
|
|
|
// let default_ticket = default_ticket();
|
|
|
|
if let Err(e) = builder.merge(default_ticket) { |
|
|
|
// if let Err(e) = builder.merge(default_ticket) {
|
|
|
|
println!("Failed to merge default ticket: {:?}", e); |
|
|
|
// println!("Failed to merge default ticket: {:?}", e);
|
|
|
|
return; |
|
|
|
// return;
|
|
|
|
} |
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let ticket = builder.build().unwrap(); |
|
|
|
let ticket = builder.build().unwrap(); |
|
|
|
|
|
|
|
|
|
|
|
let path = Path::new(&document_path); |
|
|
|
// let xml=ticket.get_xml();
|
|
|
|
|
|
|
|
// let xml_string = String::from_utf8_lossy(&xml).to_string();
|
|
|
|
|
|
|
|
// println!("PrintTicket XML as String: {}", xml_string);
|
|
|
|
|
|
|
|
// return;
|
|
|
|
|
|
|
|
|
|
|
|
if path.extension().map(|ext| ext.eq_ignore_ascii_case("pdf")).unwrap_or(false) { |
|
|
|
let path = Path::new(&document_path); |
|
|
|
let printer=PdfiumPrinter::new(my_device); |
|
|
|
let printer = PdfiumPrinter::new(my_device); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if path |
|
|
|
|
|
|
|
.extension() |
|
|
|
|
|
|
|
.map(|ext| ext.eq_ignore_ascii_case("pdf")) |
|
|
|
|
|
|
|
.unwrap_or(false) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
printer.print(path, ticket).unwrap(); |
|
|
|
printer.print(path, ticket).unwrap(); |
|
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
} else { |
|
|
|
let printer=ImagePrinter::new(my_device); |
|
|
|
match util::imageToPdf(document_path.clone()) { |
|
|
|
printer.print(path, ticket).unwrap(); |
|
|
|
Ok(pdf_path) => { |
|
|
|
|
|
|
|
// Print the converted PDF using the printer
|
|
|
|
|
|
|
|
printer.print(Path::new(&pdf_path), ticket).unwrap(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
Err(e) => { |
|
|
|
|
|
|
|
println!("Error converting image to PDF: {}", e); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
// let theprinter = PdfiumPrinter::new(my_device);
|
|
|
|
// let theprinter = PdfiumPrinter::new(my_device);
|
|
|
|
// let theprinter = ImagePrinter::new(my_device);
|
|
|
|
// let theprinter = ImagePrinter::new(my_device);
|
|
|
|
// theprinter.print(path, ticket).unwrap();
|
|
|
|
// theprinter.print(path, ticket).unwrap();
|
|
|
|
} |
|
|
|
} |
|
|
|
#[cfg_attr(mobile, tauri::mobile_entry_point)] |
|
|
|
#[cfg_attr(mobile, tauri::mobile_entry_point)] |
|
|
|
pub fn run() { |
|
|
|
pub fn run() { |
|
|
|
tauri::Builder::default() |
|
|
|
tauri::Builder::default() |
|
|
|
|
|
|
|
.plugin(tauri_plugin_fs::init()) |
|
|
|
.plugin(tauri_plugin_dialog::init()) |
|
|
|
.plugin(tauri_plugin_dialog::init()) |
|
|
|
.plugin(tauri_plugin_opener::init()) |
|
|
|
.plugin(tauri_plugin_opener::init()) |
|
|
|
.invoke_handler(tauri::generate_handler![ |
|
|
|
.invoke_handler(tauri::generate_handler![ |
|
|
|
|