Print-Tabellen: Seitenumbrueche gezielt steuern in CSS
AI generated
{ }
@
CSS · Print · Tabellen · Seitenumbrueche
Print-Tabellen: Seitenumbrueche gezielt steuern
Wenn eine Bestellliste ueber mehrere Seiten laeuft, ohne dabei zu zerreissen

Eine lange Tabelle, die beim Drucken mitten in einer Zeile umbricht, ist einer der sichtbarsten CSS-Fehler auf Rechnungen und Bestellbestaetigungen. Mit break-inside: avoid fuer Zeilen und einem korrekt eingesetzten thead als wiederholtem Kopf lassen sich Seitenumbrueche gezielt so steuern, dass jede Seite fuer sich lesbar bleibt, ganz ohne JavaScript oder serverseitiges PDF-Rendering.

15 Min. Lesezeit break-inside · thead Repeat Rechnungen & Bestellbestaetigungen

1. Das Grundproblem: warum Tabellen beim Drucken zerreissen

Browser brechen eine Seite standardmäßig genau dort um, wo der verfügbare Platz endet, ohne Rücksicht darauf, ob dieser Punkt mitten in einer Tabellenzeile liegt. Bei einer Bestellliste mit vielen Positionen bedeutet das im schlimmsten Fall, dass Artikelname, Menge und Preis einer Zeile auf zwei unterschiedliche Seiten verteilt werden, während die zugehörigen Spaltenüberschriften nur auf der ersten Seite sichtbar bleiben.

Dieses Verhalten ist kein Fehler des Browsers, sondern die konsequente Standardeinstellung ohne explizite Steuerung: Der Druckalgorithmus kennt den logischen Zusammenhang zwischen den Zellen einer Zeile nicht automatisch, er sieht nur eine fortlaufende Folge von Boxen, die er an der nächstbesten Gelegenheit umbricht. Erst gezielte CSS-Regeln teilen dem Browser mit, welche Bereiche als Einheit zusammenbleiben müssen.

2. break-inside: avoid für Tabellenzeilen

Die Property break-inside: avoid, angewendet auf tr, weist den Browser an, innerhalb einer Tabellenzeile möglichst keinen Seitenumbruch vorzunehmen, sondern die gesamte Zeile stattdessen auf die nächste Seite zu verschieben, falls sie nicht mehr vollständig auf die aktuelle passt. Für die überwiegende Mehrheit der Zeilen mit normaler Höhe funktioniert das zuverlässig in allen modernen Browsern und löst das Kernproblem zerrissener Zeilen fast vollständig.

Bei außergewöhnlich hohen Zeilen, etwa mit mehrzeiligem Freitext in einer Spalte, kann avoid an physikalische Grenzen stoßen: Passt die Zeile selbst nicht auf eine ganze Seite, muss der Browser trotzdem irgendwo umbrechen. In der Praxis betrifft das selten normale Bestellpositionen, aber bei Freitextfeldern wie Lieferhinweisen lohnt sich eine bewusste Begrenzung der Zeilenhöhe im Druck-Stylesheet.


@media print {
  table {
    border-collapse: collapse;
    width: 100%;
  }

  /* Zeilen nicht mitten im Umbruch zerreissen */
  tr {
    break-inside: avoid;
  }

  /* Ueberschriften und Fusszeilen ebenfalls schuetzen */
  h1, h2, h3, .invoice-header {
    break-after: avoid;
  }
}

3. Wiederholte Tabellenköpfe mit thead über Seitenumbrüche

Ein semantisch korrekt ausgezeichnetes <thead> wird von allen gängigen Browsern beim Drucken automatisch auf jeder neuen Seite wiederholt, auf der die Tabelle fortgesetzt wird, vorausgesetzt die Tabelle nutzt tatsächlich thead, tbody und nicht einfach nur tr-Elemente direkt unter table. Diese automatische Wiederholung ist keine CSS-Eigenschaft im engeren Sinne, sondern eingebautes Verhalten der HTML-Tabellensemantik in Kombination mit dem Druckmodell des Browsers.

Der häufigste Grund, warum dieses Verhalten in der Praxis nicht funktioniert, ist fehlendes oder falsch strukturiertes Markup: Wird die Kopfzeile nur optisch mit font-weight: bold hervorgehoben, aber technisch als normale tr innerhalb von tbody ausgezeichnet, erkennt der Browser sie nicht als wiederholbaren Kopf und zeigt die Spaltenbeschriftung nur auf der ersten Seite.


<table class="order-items">
  <thead>
    <tr>
      <th>Artikel</th>
      <th>Menge</th>
      <th>Einzelpreis</th>
      <th>Summe</th>
    </tr>
  </thead>
  <tbody>
    <tr><td>Produkt A</td><td>2</td><td>19,90 EUR</td><td>39,80 EUR</td></tr>
    <tr><td>Produkt B</td><td>1</td><td>49,00 EUR</td><td>49,00 EUR</td></tr>
    <!-- ... viele weitere Zeilen ... -->
  </tbody>
</table>

4. tfoot für Summenzeilen: fixiert am Seitenende oder nur am Tabellenende

Neben thead unterstützen Browser auch <tfoot> als wiederholbaren Fußbereich, allerdings mit einem wichtigen Unterschied: Anders als der Tabellenkopf erscheint der Fuß standardmäßig nur am tatsächlichen Ende der gesamten Tabelle, nicht auf jeder Zwischenseite. Für eine Zwischensumme, die auf jeder Seite unten stehen soll, reicht tfoot allein deshalb nicht aus.

Für dieses Muster, wie es bei mehrseitigen Rechnungen mit laufender Zwischensumme üblich ist, braucht es eine Kombination aus mehreren, bewusst wiederholten Zeilen innerhalb des Inhaltsbereichs selbst oder eine serverseitige Aufteilung der Tabelle in mehrere kleinere Tabellen mit jeweils eigener Zwischensumme, weil reines CSS keinen Mechanismus für seitenbezogene Laufsummen kennt.

5. Zusammenspiel mit @page: Kopf- und Fußzeilen der Druckseite

Während thead den Tabellenkopf innerhalb des Inhaltsflusses wiederholt, regeln @page-Regeln mit ihren Margin-Boxen die eigentliche Kopf- und Fußzeile der Druckseite selbst, etwa Firmenlogo, Seitenzahl oder Rechnungsnummer, die unabhängig vom Tabelleninhalt auf jeder Seite erscheinen sollen. Beide Mechanismen ergänzen sich: thead für den fachlichen Tabellenkopf, @page-Margin-Boxen für den dokumentweiten Seitenrahmen.

Eine Bestellbestätigung mit vielen Positionen profitiert typischerweise von beidem gleichzeitig: Die Margin-Box am oberen Seitenrand zeigt Firmenlogo und Bestellnummer auf jeder Seite, während der wiederholte thead direkt über der Tabelle die Spaltenbeschriftung für die fortgesetzte Positionsliste liefert. So bleibt jede einzelne gedruckte Seite ohne Kontextverlust lesbar, auch wenn sie isoliert betrachtet wird.


@page {
  size: A4;
  margin: 2cm 1.5cm;

  @top-right {
    content: "Bestellbestaetigung " counter(page) " / " counter(pages);
  }
}

6. Häufige Druckfehler bei Bestellbestätigungen und Rechnungen

Der mit Abstand häufigste Fehler ist eine Tabelle, deren Kopfzeile technisch als normale tr in tbody steht, sodass die Spaltenbeschriftung nur auf Seite eins erscheint und jede Folgeseite ohne Kontext dasteht. Der zweithäufigste Fehler ist ein fehlendes break-inside: avoid, wodurch einzelne Positionszeilen mitten durch Menge und Preis geschnitten werden, was bei einer Rechnung schnell wie ein Rechenfehler statt wie ein Layoutfehler aussieht.

Ein dritter, subtilerer Fehler entsteht durch feste Pixel-Höhen auf Tabellenzellen in Kombination mit variabler Schriftgröße im Druck: Passt der tatsächliche Zellinhalt nicht in die fest vorgegebene Höhe, kann Text abgeschnitten werden, ohne dass der Browser dafür eine Fehlermeldung ausgibt. Für Druck-Stylesheets sind deshalb feste Höhen auf Tabellenzellen generell zu vermeiden, der Inhalt sollte die Zeilenhöhe bestimmen, nicht umgekehrt.

7. Testen von Seitenumbrüchen ohne echten Drucker

Die Druckvorschau des Browsers, meist über Strg/Cmd + P erreichbar, zeigt Seitenumbrüche fast identisch zum späteren PDF- oder Papierausdruck an und ist damit das schnellste Testwerkzeug im Entwicklungsalltag. Für automatisierte Regressionstests lässt sich derselbe Effekt mit Headless-Browsern erzeugen, die eine Seite direkt als PDF exportieren und so eine reproduzierbare Grundlage für visuelle Vergleichstests liefern.

Besonders wichtig ist, verschiedene Datenmengen zu testen, nicht nur eine einzelne Beispielbestellung: eine Tabelle mit genau einer Zeile, eine mit exakt so vielen Zeilen, dass der Umbruch knapp vor oder nach der letzten Zeile einer Seite liegt, und eine sehr lange Liste über mehrere Seiten hinweg. Genau an diesen Randfällen zeigen sich die meisten Fehler in der Umbruchlogik.

8. Grenzen von reinem CSS gegenüber Server-seitigem PDF-Export

Reines Browser-CSS beherrscht Seitenumbrüche, wiederholte Tabellenköpfe und einfache Margin-Boxen zuverlässig, stößt aber an Grenzen bei komplexeren Layoutanforderungen wie exakt kontrollierten laufenden Zwischensummen pro Seite oder pixelgenauer Positionierung für vorgedruckte Formulare. Solche Anforderungen sind mit CSS zwar teilweise über Umwege lösbar, aber oft fragiler als eine dedizierte serverseitige PDF-Bibliothek.

Für regulatorisch heikle Dokumente wie Rechnungen mit gesetzlichen Formatvorgaben lohnt sich deshalb eine bewusste Entscheidung: einfache, häufig geänderte Druckansichten wie Bestellbestätigungen bleiben gut mit CSS wartbar, während hochformalisierte, seltener geänderte Dokumente wie Steuerrechnungen von einer serverseitigen PDF-Generierung mit exakter Layout-Kontrolle profitieren können.

9. Checkliste für mehrseitige Tabellen im Druck

Vor dem Livegang eines Rechnungs- oder Bestellbestätigungs-Layouts lohnt sich eine kurze Prüfung: Steht die Kopfzeile korrekt in thead, ist break-inside: avoid auf tr gesetzt, sind feste Pixel-Höhen auf Zellen entfernt, und wurde die Druckvorschau mit einer sehr langen sowie einer sehr kurzen Beispielliste getestet.

Diese vier Punkte decken die überwiegende Mehrheit der Probleme ab, die in der Praxis bei mehrseitigen Tabellen im Druck auftreten, und lassen sich alle ohne JavaScript oder serverseitige Zusatzwerkzeuge direkt im CSS lösen.

Regel Wirkung Wiederholt sich pro Seite Typischer Einsatz
tr { break-inside: avoid } Zeile bleibt geschlossen oder wandert komplett auf naechste Seite Pro Zeile neu bewertet Bestellpositionen, Rechnungszeilen
<thead> Spaltenkopf wird automatisch wiederholt Ja, auf jeder Folgeseite Tabellenkoepfe bei langen Listen
<tfoot> Fusszeile erscheint standardmaessig nur am Tabellenende Nein, nur einmal Gesamtsumme am Ende der Tabelle
@page { @top-right } Seitenrand-Inhalt wie Seitenzahl oder Logo Ja, auf jeder Seite Dokumentweite Kopf- und Fusszeilen
Feste Zellhoehe (px) Kann Inhalt abschneiden, keine Fehlermeldung Betrifft jede Zeile Sollte im Druck vermieden werden

Mironsoft

Modernes CSS, Layout-Architektur und Rendering-Performance

CSS, das wartbar bleibt statt mit jeder Änderung zu brechen?

Wir prüfen bestehende Stylesheets auf Spezifitäts-Chaos und Layout-Thrashing und bauen daraus eine CSS-Architektur mit Cascade Layers, Custom Properties und modernen Layout-Primitiven, die auch nach dem zehnten Feature noch verständlich ist.

CSS-Audit

Spezifität, Cascade-Konflikte und ungenutzte Selektoren systematisch aufdecken.

Architektur-Refactoring

Cascade Layers, Custom Properties und Design Tokens sauber einführen.

Performance-Tuning

Layout-Thrashing, teure Selektoren und Rendering-Engpässe gezielt beheben.

10. Zusammenfassung

Print-Tabellen und Seitenumbrueche: Das Wichtigste auf einen Blick

break-inside: avoid

Auf tr gesetzt verhindert es, dass eine Zeile mitten im Umbruch zerrissen wird, die Zeile wandert stattdessen als Ganzes auf die naechste Seite.

thead als Repeat-Header

Ein korrekt ausgezeichnetes thead wird von Browsern automatisch auf jeder Folgeseite wiederholt, tfoot dagegen nur am Tabellenende.

Haeufigster Fehler

Kopfzeilen, die technisch als normale tr in tbody stehen, erscheinen nur auf Seite eins und lassen Folgeseiten ohne Kontext.

Grenzen von CSS

Laufende Zwischensummen pro Seite und pixelgenaue Formularpositionierung erfordern oft serverseitige PDF-Generierung.

11. FAQ: Print-Tabellen und Seitenumbrueche: Das Wichtigste auf einen Blick

1Wie verhindere ich, dass eine Tabellenzeile mitten im Seitenumbruch zerrissen wird?
Mit break-inside: avoid auf dem tr-Element. Der Browser verschiebt die gesamte Zeile dann auf die naechste Seite, statt sie mittendrin zu zerschneiden.
2Wiederholt sich der Tabellenkopf automatisch auf jeder gedruckten Seite?
Ja, wenn er korrekt als thead ausgezeichnet ist. Steht die Kopfzeile stattdessen als normale tr in tbody, erscheint sie nur auf der ersten Seite.
3Warum funktioniert die automatische Wiederholung bei mir nicht?
Meist weil die Kopfzeile nur optisch fett formatiert, aber nicht technisch als thead ausgezeichnet ist. Der Browser erkennt sie dann nicht als wiederholbaren Bereich.
4Erscheint tfoot auch auf jeder Seite wie thead?
Nein. tfoot erscheint standardmaessig nur am tatsaechlichen Ende der gesamten Tabelle, nicht auf jeder Zwischenseite. Fuer laufende Zwischensummen pro Seite reicht tfoot allein nicht.
5Wie kombiniere ich thead mit dokumentweiten Kopf- und Fusszeilen?
thead wiederholt den fachlichen Tabellenkopf innerhalb des Inhalts, waehrend @page-Margin-Boxen wie @top-right unabhaengig davon Seitenzahl oder Logo auf jeder Seite anzeigen. Beide Mechanismen ergaenzen sich.
6Was ist der haeufigste Fehler bei mehrseitigen Rechnungen im Druck?
Eine Kopfzeile, die technisch nicht als thead deklariert ist, sodass Folgeseiten ohne Spaltenbeschriftung dastehen. Fehlendes break-inside: avoid, wodurch Zeilen zerschnitten werden, ist der zweithaeufigste Fehler.
7Sollten Tabellenzellen im Druck feste Pixel-Hoehen bekommen?
Nein. Feste Hoehen koennen Inhalt abschneiden, wenn der tatsaechliche Text nicht hineinpasst, ohne dass eine Fehlermeldung erscheint. Die Zeilenhoehe sollte sich am Inhalt orientieren.
8Wie teste ich Seitenumbrueche ohne echten Drucker?
Mit der Druckvorschau des Browsers ueber Strg oder Cmd plus P. Fuer automatisierte Tests eignen sich Headless-Browser, die eine Seite direkt als PDF exportieren.
9Kann CSS eine laufende Zwischensumme auf jeder gedruckten Seite anzeigen?
Nicht zuverlaessig mit reinem CSS. Dafuer braucht es entweder eine serverseitige Aufteilung der Tabelle in mehrere Teiltabellen oder ein dediziertes PDF-Generierungswerkzeug.
10Wann lohnt sich serverseitiges PDF-Rendering statt reinem Druck-CSS?
Bei regulatorisch formalisierten Dokumenten wie Steuerrechnungen mit exakten Formatvorgaben. Einfache, haeufig geaenderte Ansichten wie Bestellbestaetigungen bleiben dagegen gut mit CSS wartbar.