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 ?

97voto

Troy Alford Points 8676

Vous pouvez essayer cela avec CSS :

<table class="print-friendly">
 <!-- The rest of your table here -->
</table>

<style>
    table.print-friendly tr td, table.print-friendly tr th {
        page-break-inside: avoid;
    }
</style>

La plupart des règles CSS ne s'appliquent pas aux <tr> directement, en raison de ce que vous avez souligné plus haut - ils ont un nom unique. display qui ne tient pas compte de ces règles CSS. Cependant, le style <td> y <th> à l'intérieur de ceux-ci, généralement faire permettent ce genre de spécification - et vous pouvez facilement appliquer de telles règles à TOUS les enfants- <tr> et <td> à l'aide de CSS, comme indiqué ci-dessus.

25 votes

Malheureusement, cela ne fonctionne pas (encore) avec les navigateurs basés sur webkit.

3 votes

Oui - il y a quelques bizarreries. Voir la réponse de @Peter dans cette question : stackoverflow.com/questions/7706504/ pour plus d'informations.

3 votes

Cela ne fonctionne que si vous prenez le tableau entier, pas seulement tr/td : stackoverflow.com/a/13525758/729324

40voto

Aaron Hill Points 144

Le meilleur moyen que j'ai trouvé pour résoudre ce problème dans les navigateurs webkit est de placer un div à l'intérieur de chaque élément td et d'appliquer le style page-break-inside : avoid au div, comme ceci :

...
<td>
  <div class="avoid">
    Cell content.
  </div>
</td>
...
<style type="text/css">
  .avoid {
    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 */
  }
</style>

Même si Chrome ne reconnaît pas la propriété "page-break-inside : avoid ;", cela semble empêcher le contenu de la ligne d'être coupé en deux par un saut de page lorsque vous utilisez wktohtml pour générer des PDF. L'élément tr peut dépasser un peu du saut de page, mais pas le div ni ce qu'il contient.

0 votes

El margin: 4px 0 4px 0; a fait l'affaire pour moi, je perdais un disque de temps en temps. Merci

0 votes

Le problème de cette approche est que, parfois, seules quelques cellules d'une rangée sont cassées vers la page suivante, alors que chaque cellule prise séparément ne sera pas cassée.

0 votes

@WorldSEnder Oui. Avez-vous trouvé un moyen de contourner ce problème ?

25voto

phidias Points 29

J'ai utilisé l'astuce des 4px de @AaronHill ci-dessus ( lien ) et cela a très bien fonctionné ! J'ai cependant utilisé une règle css plus simple sans avoir besoin d'ajouter une classe à chaque <td> dans le tableau.

@media print {
    table tbody tr td:before,
    table tbody tr td:after {
        content : "" ;
        height : 4px ;
        display : block ;
    }
}

1 votes

Cela n'a pas fonctionné pour moi

17voto

Jason Silver Points 457

J'ai trouvé une nouvelle façon de résoudre ce problème, du moins pour moi (Chrome Version 63.0.3239.84 (Official Build) (64-bit) sur MacOS Sierra)

Ajoutez une règle CSS au tableau parent :

table{
    border-collapse:collapse;
}

et pour le Td :

tr td{
    page-break-inside: avoid;
    white-space: nowrap;
}

J'ai en fait trouvé cette solution sur Stack Overflow, mais elle n'est pas apparue dans les premières recherches sur Google : CSS pour arrêter le saut de page à l'intérieur d'une ligne de tableau

Bravo à @Ibrennan208 pour avoir résolu le problème !

1 votes

Il a résolu le problème de la rangée de table de coupe, il a cassé d'autres conceptions.

12voto

spsaucier Points 524

J'ai constaté que page-break-inside: avoid ne fonctionnera pas si l'un des éléments parents de la table est display: inline-block o flex . Assurez-vous que tous les éléments parents sont display: block .

Pensez également à remplacer table , tr , td 's display styles avec CSS grid pour la mise en page d'impression si vous continuez à avoir des problèmes avec le tableau.

0 votes

J'ai résolu le problème de mes tableaux multiples qui étaient fragmentés à des endroits bizarres et dont le texte se chevauchait dans Chrome, avec l'aide de cette question : ajouté display:block !important; a body y div lors de l'impression, ainsi que page-break-inside: avoid; a table .

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