main
reng 4 months ago
parent 997132c41a
commit 7159fdb110
  1. 84
      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<String, Vec<String>>
}
}
}
fn default_ticket() -> PrintTicket {
// let mut ticket = PrintTicket::new();
let xml=r#"<?xml version="1.0" encoding="UTF-8"?>
<psf:PrintTicket version="1"
xmlns:psf="http://schemas.microsoft.com/windows/2003/08/printing/printschemaframework"
xmlns:psk="http://schemas.microsoft.com/windows/2003/08/printing/printschemakeywords">
<psf:Feature name="psk:PageScaling">
<psf:Option name="psk:FitToPage" />
</psf:Feature>
<psf:Feature name="psk:PageOutputQuality">
<psf:Option name="psk:High" />
</psf:Feature>
</psf:PrintTicket>"#;
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::<PredefinedMediaName>()
.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::<u32>().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::<PredefinedPageOutputColor>().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();

Loading…
Cancel
Save