Fix silent printing and shorten printer display names
- Print directly via win32print API without opening PDF viewer - Shorten printer names to 20 chars in dropdown (strip server prefix for network printers) - Map display names back to full names for printing - PDF backup saved silently without launching viewer
This commit is contained in:
@@ -38,15 +38,42 @@ class LabelPrinterApp(App):
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
self.available_printers = self.get_available_printers()
|
||||
# Build printer display names and mapping to full names
|
||||
full_printers = get_available_printers()
|
||||
self.printer_display_map = {} # display_name -> full_name
|
||||
self.available_printers = []
|
||||
for full_name in full_printers:
|
||||
display_name = self._shorten_printer_name(full_name)
|
||||
# Ensure unique display names
|
||||
if display_name in self.printer_display_map:
|
||||
display_name = full_name[:20]
|
||||
self.printer_display_map[display_name] = full_name
|
||||
self.available_printers.append(display_name)
|
||||
# Clean old PDF backup files on startup
|
||||
self.cleanup_old_pdfs()
|
||||
# Clean old log files on startup
|
||||
self.cleanup_old_logs()
|
||||
|
||||
def get_available_printers(self):
|
||||
"""Get list of available printers (cross-platform)"""
|
||||
return get_available_printers()
|
||||
def _shorten_printer_name(self, name, max_len=20):
|
||||
"""Shorten printer name for display (max 20 chars).
|
||||
For network printers like \\\\server\\printer, show just the printer part."""
|
||||
if name.startswith('\\\\'):
|
||||
# Network printer: \\server\printer -> extract printer name
|
||||
parts = name.strip('\\').split('\\')
|
||||
if len(parts) >= 2:
|
||||
short = parts[-1] # Just the printer name
|
||||
else:
|
||||
short = name
|
||||
else:
|
||||
short = name
|
||||
# Truncate to max_len
|
||||
if len(short) > max_len:
|
||||
short = short[:max_len]
|
||||
return short
|
||||
|
||||
def _get_full_printer_name(self, display_name):
|
||||
"""Resolve display name back to full printer name for printing."""
|
||||
return self.printer_display_map.get(display_name, display_name)
|
||||
|
||||
def cleanup_old_pdfs(self, days=5):
|
||||
"""
|
||||
@@ -278,7 +305,8 @@ class LabelPrinterApp(App):
|
||||
values=self.available_printers,
|
||||
size_hint_y=None,
|
||||
height=45,
|
||||
font_size='12sp'
|
||||
font_size='12sp',
|
||||
sync_height=True,
|
||||
)
|
||||
self.printer_spinner = printer_spinner
|
||||
form_layout.add_widget(printer_spinner)
|
||||
@@ -320,7 +348,8 @@ class LabelPrinterApp(App):
|
||||
sap_nr = self.sap_input.text.strip()
|
||||
quantity = self.qty_input.text.strip()
|
||||
cable_id = self.cable_id_input.text.strip()
|
||||
printer = self.printer_spinner.text
|
||||
# Resolve display name to full printer name
|
||||
printer = self._get_full_printer_name(self.printer_spinner.text)
|
||||
|
||||
# Validate input
|
||||
if not sap_nr and not quantity and not cable_id:
|
||||
|
||||
Reference in New Issue
Block a user