buildHtml($euer, $settings); $mpdf = new Mpdf([ 'mode' => 'utf-8', 'format' => 'A4', 'margin_top' => 20, 'margin_bottom' => 20, 'margin_left' => 20, 'margin_right' => 20, ]); $mpdf->SetTitle('EÜR ' . $euer['year']); $mpdf->SetAuthor($settings['firma'] ?? ''); $mpdf->WriteHTML($this->buildCss(), \Mpdf\HTMLParserMode::HEADER_CSS); $mpdf->WriteHTML($html, \Mpdf\HTMLParserMode::HTML_BODY); $mpdf->Output('EÜR-' . $euer['year'] . '.pdf', 'D'); } private function buildHtml(array $euer, array $settings): string { $h = fn($v) => htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8'); $fmt = fn($v) => number_format((float)$v, 2, ',', '.') . ' €'; $firma = $h($settings['firma'] ?? ''); $year = $euer['year']; // Build table rows $rows = ''; $maxRows = max(count($euer['einnahmen']), count($euer['ausgaben'])); for ($i = 0; $i < $maxRows; $i++) { $e = $euer['einnahmen'][$i] ?? null; $a = $euer['ausgaben'][$i] ?? null; $rows .= ''; $rows .= $e ? '' . $h($e['kontonummer']) . '' . $h($e['bezeichnung']) . '' . $fmt($e['netto']) . '' : ' '; $rows .= ''; $rows .= $a ? '' . $h($a['kontonummer']) . '' . $h($a['bezeichnung']) . '' . $fmt($a['netto']) . '' : ' '; $rows .= ''; } $gewinnLabel = $euer['gewinn'] >= 0 ? 'Überschuss (Gewinn)' : 'Fehlbetrag (Verlust)'; $gewinnClass = $euer['gewinn'] >= 0 ? 'positive' : 'negative'; return <<Einnahmen-Überschuss-Rechnung {$year}

{$firma} · Geschäftsjahr {$year}

{$rows}
Betriebseinnahmen Betriebsausgaben
Kto.BezeichnungBetrag Kto.BezeichnungBetrag
Summe Einnahmen {$fmt($euer['total_einnahmen'])} Summe Ausgaben {$fmt($euer['total_ausgaben'])}
{$gewinnLabel}: {$fmt($euer['gewinn'])}

Erstellt am {$h(date('d.m.Y H:i'))} · Steuerkram

HTML; } private function buildCss(): string { return <<