Skip to content

Commit 65bf5ee

Browse files
Nicolettaclaude
authored andcommitted
fix: PDF auf Windows (fpdf2-Fonts) + backend.exe-Terminierung via CloseRequested
PDF: - _find_dejavu_dir() sucht jetzt zuerst in fpdf2-internen Fonts (fpdf/fonts/) → plattformunabhängig, funktioniert auf Windows + in PyInstaller-Bundle - Bisher wurden nur Linux-Systempfade geprüft → FileNotFoundError → 500er backend.exe: - Backend wird jetzt in WindowEvent::CloseRequested synchron beendet (kill_backend_inner mit taskkill /F /T auf Windows) - Zuverlässiger als RunEvent::Exit, das nach shell.open()-Aufrufen (PDF-Links im Systembrowser) Race-Conditions hatte - RunEvent::Exit bleibt als Fallback erhalten Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent bc6bf74 commit 65bf5ee

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed

src-tauri/src/lib.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,28 @@ pub fn run() {
8585

8686
app.manage(BackendChild(Mutex::new(Some(child))));
8787
log::info!("Backend-Sidecar gestartet auf Port {}", port);
88+
89+
// Backend beim Schließen des Hauptfensters synchron beenden.
90+
// CloseRequested feuert zuverlässiger als RunEvent::Exit und
91+
// vermeidet Race-Conditions mit shell.open() (PDF-Links).
92+
let ah = app.handle().clone();
93+
app.get_webview_window("main")
94+
.expect("Hauptfenster nicht gefunden")
95+
.on_window_event(move |event| {
96+
if let tauri::WindowEvent::CloseRequested { .. } = event {
97+
if let Some(child) = ah.state::<BackendChild>().0.lock().unwrap().take() {
98+
kill_backend_inner(child);
99+
}
100+
}
101+
});
102+
88103
Ok(())
89104
})
90105
.invoke_handler(tauri::generate_handler![get_backend_port, kill_backend, open_url])
91106
.build(tauri::generate_context!())
92107
.expect("Fehler beim Erstellen der Tauri-Anwendung")
93108
.run(|app_handle, event| {
109+
// Fallback: Falls CloseRequested nicht gefeuert hat (z.B. kein Hauptfenster)
94110
if let tauri::RunEvent::Exit = event {
95111
if let Some(child) = app_handle.state::<BackendChild>().0.lock().unwrap().take() {
96112
kill_backend_inner(child);

src/backend/utils/pdf_rechnung.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,15 @@
3030

3131

3232
def _find_dejavu_dir() -> Path:
33+
# Erst: fpdf2-interne Fonts (immer vorhanden, plattformunabhängig – auch Windows/PyInstaller)
34+
try:
35+
import fpdf as _fpdf_mod
36+
fpdf_fonts = Path(_fpdf_mod.__file__).parent / "fonts"
37+
if (fpdf_fonts / "DejaVuSans.ttf").exists():
38+
return fpdf_fonts
39+
except Exception:
40+
pass
41+
# Fallback: System-Fonts (Linux)
3342
candidates = [
3443
Path("/usr/share/fonts/truetype/dejavu"),
3544
Path("/usr/share/fonts/dejavu"),

src/frontend/src/data/changelog.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ export type ChangelogVersion = {
2222
}
2323

2424
export const CHANGELOG: ChangelogVersion[] = [
25+
{
26+
version: 'v0.1.26',
27+
datum: 'März 2026',
28+
eintraege: [
29+
{ typ: 'fix', text: 'Windows: PDF-Generierung funktioniert jetzt – DejaVu-Schriften werden direkt aus dem fpdf2-Paket geladen statt aus Linux-Systempfaden gesucht' },
30+
{ typ: 'fix', text: 'Windows: backend.exe wird beim Schließen der App wieder zuverlässig beendet – Prozess wird jetzt direkt beim Window-Close-Event statt beim App-Exit-Event getötet' },
31+
],
32+
},
2533
{
2634
version: 'v0.1.25',
2735
datum: 'März 2026',

0 commit comments

Comments
 (0)