126 votes

éviter le saut de page dans une ligne du tableau

Je veux éviter le saut de page à l'intérieur d'une ligne de tableau en html, lorsque je convertis html en PDF par wkhtmltopdf. J'utilise page-break-inside:avoid avec le tableau - cela fonctionne, mais j'ai tellement de lignes, alors ça ne marche pas. Si l'affichage de tr en tant que bloc ou autre chose, cela change la mise en forme du tableau. et insérer une double bordure. Il est également possible d'insérer l'en-tête du tableau sur chaque page, là où le tableau a été divisé.

1 votes

Désolé, quel est le problème quand on utilise page-break-inside: avoid; ?

2 votes

@ChristianVarga lorsque j'utilise page-break-inside:avoid avec tr, cela ne fonctionne pas.

0 votes

Vous avez essayé de le mettre sur l'élément de table à la place ?

10voto

L'utilisation de CSS page-break-inside ne fonctionnera pas (c'est un problème du navigateur webkit).

Il existe un hack de division de tableau JavaScript wkhtmltopdf qui divise un long tableau en plus petits tableaux automatiquement en fonction de la taille de la page que vous spécifiez (plutôt que de diviser la page après une valeur statique de x lignes) : https://gist.github.com/3683510

0 votes

Ce hack js fonctionnera si je veux juste imprimer la page web sans wkhtmltopdf ?

0 votes

C'est le seul qui a fonctionné pour moi. Fonctionne également avec la bibliothèque HTML-PDF.

10voto

Troy Morehouse Points 720

La seule solution que j'ai trouvée pour fonctionner est de placer chaque élément TR à l'intérieur de son propre élément TBODY, et d'appliquer les règles de saut de page à l'élément TBODY via css

1 votes

Cela fonctionne mieux que le reste pour moi sur Chromium Version 40.0.2214.111 (64-bit) sur Arch Linux. C'est moche et difficile à comprendre, mais apparemment, de nombreux utilisateurs de Chromium ont déjà utilisé cette méthode. tbody sont valables à l'intérieur d'un table stackoverflow.com/questions/3076708/

0 votes

Cela ne fonctionne pas pour moi (Chrome 56.0.2924.87 (64 bits), Mac OS 10.12.2).

0 votes

Merci ! Cela m'a permis de trouver une solution qui a fonctionné pour moi - stackoverflow.com/a/71952985/11747650

8voto

Aaron Newton Points 956

J'ai écrit le JavaScript suivant basé sur la réponse d'Aaron Hill :

//Add a div to each table cell so these don't break across pages when printed
//See http://stackoverflow.com/a/17982110/201648
$(document).ready(function () {
    var ctlTd = $('.dontSplit td');
    if (ctlTd.length > 0)
    {
        //console.log('Found ctlTd');
        ctlTd.wrapInner('<div class="avoidBreak" />');
    }
});

dontSplit est la classe de la table où vous ne voulez pas que les td's soient répartis sur plusieurs pages. Utilisez ceci avec le CSS suivant (encore une fois, attribué à Aaron Hill) :

 .avoidBreak {
    page-break-inside: avoid !important;
    margin: 4px 0 4px 0;  /* to keep the page break from cutting too close to the text in the div */
  }

Cela semble bien fonctionner dans la dernière version de Chrome.

1 votes

Je rends de grands tableaux au format PDF en utilisant wkhtmltopdf, et c'est la seule solution qui a donné des résultats acceptables. Cela pourrait être mieux (Webkit ne répète pas les bordures des cellules après un saut de page), mais au moins le contenu est là. Merci !

0 votes

Cela ne fonctionne pas lorsque l'on imprime en utilisant Ctrl+P.

8voto

gilbert-v Points 1036

La solution 2020

La seule chose que j'ai réussi à faire fonctionner de manière cohérente sur tous les navigateurs est de placer chaque ligne dans son propre élément de tableau . Cela fonctionne également avec le nœud HTML-PDF. Ensuite, il suffit de mettre tout à page-break-inside: avoid .

table,
tr,
td,
div {
    page-break-inside: avoid;
}

Le seul inconvénient de cette méthode est que vous devez définir manuellement la largeur des colonnes, sinon le résultat est plutôt étrange. La méthode suivante a bien fonctionné pour moi avec deux colonnes.

td:first-child { width: 30% }
td:last-child { width: 70% }

Exemple

<table>
  <tr>
    <td>Forename</td>
    <td>John</td>
  </tr>
</table>
<table>
  <tr>
    <td>Surname</td>
    <td>Piper</td>
  </tr>
</table>
<table>
  <tr>
    <td>Website</td>
    <td>desiringgod.org</td>
  </tr>
</table>

0 votes

Pourriez-vous fournir un exemple de table HTML ? Merci.

0 votes

Merci, @gilbert-v pour l'édition avec exemple. Je vais essayer ceci.

1 votes

C'est la solution que je finis par utiliser. J'ai besoin de regrouper 2 à 4 lignes qui représentent une entité de données, de sorte que les sauts de page se fassent uniquement entre ces groupes de lignes, mais pas à l'intérieur. Je place chaque groupe dans un tableau distinct. Le seul problème ici est d'obtenir des largeurs de colonne cohérentes dans tous les tableaux.

7voto

vinayakshukre Points 137

Essayez avec

white-space: nowrap; 

à td pour éviter qu'il ne se casse sur de nouvelles lignes.

1 votes

C'est beaucoup plus simple que les autres solutions. C'est nouveau ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X