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:
2026-02-06 11:18:27 +02:00
parent 1cf4482914
commit b204ce38fc
2 changed files with 80 additions and 31 deletions

View File

@@ -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: