Подтвердить что ты не робот

Избегать разрыва страницы внутри строки таблицы

Я хочу избежать разрыва страницы внутри строки таблицы в html, когда я конвертирую html в PDF по wkhtmltopdf. Я использую разрывы страниц: избегайте работы с таблицами, но у меня так много строк, то не работает. Если вы установите отображение tr как блока или что-то еще, измените форматирование таблицы и вставьте двойную границу. Или можно вставить заголовок таблицы на каждой странице, где таблица была разделена.

4b9b3361

Ответ 1

Вы можете попробовать это с помощью 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>

Большинство правил CSS не применяются непосредственно к тегам <tr>, из-за того, что вы указали выше, у них есть уникальный стиль display, который не позволяет использовать эти правила CSS. Тем не менее теги <td> и <th> внутри них обычно do допускают эту спецификацию - и вы можете легко применять такие правила для ALL child- <tr> и <td>, используя CSS, как показано выше.

Ответ 2

Лучший способ, которым я нашел решение этой проблемы в браузерах webkit, - поместить div внутри каждого td-элемента и применить разрыв страницы: избегать стиля для div, например:

...
<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>

Несмотря на то, что Chrome, предположительно, не распознает "перерыв страницы: избегайте"; свойство, похоже, что содержимое строки не разделяется пополам при использовании wktohtml для создания PDF файлов. Элемент tr может немного зависать на странице, но div и ничего внутри него не будут.

Ответ 3

Я использовал трюк 4px от @AaronHill выше (ссылка), и он работал очень хорошо! Я использовал более простое правило CSS, не добавляя класс в каждый <td> в таблице.

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

Ответ 4

Я нашел новый способ решения этой проблемы, по крайней мере для меня (Chrome версии 63.0.3239.84 (официальная сборка) (64-разрядная версия) на MacOS Sierra)

Добавьте правило CSS в родительскую таблицу:

table{
    border-collapse:collapse;
}

и тд:

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

Я нашел это решение в Qaru, но оно не появилось в начальных поисках Google: CSS, чтобы остановить разрыв страницы внутри строки таблицы

Слава @Ibrennan208 за решение проблемы!

Ответ 5

Использование CSS-break-inside не будет работать (это проблема браузера webkit).

Существует таблица разбиения таблицы JavaScript wkhtmltopdf, которая автоматически разбивает длинную таблицу на более мелкие таблицы в зависимости от указанного вами размера страницы (а не разрыва страницы после статического значения x строк): https://gist.github.com/3683510

Ответ 6

Я написал следующий JavaScript на основе ответа Аарона Хилла:

//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 - это класс таблицы, где вы не хотите, чтобы td разбивался на страницы. Используйте это со следующим CSS (опять же, приписываемым 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 */
  }

Это, похоже, прекрасно работает в последней версии Chrome.

Ответ 7

Единственный способ, которым я нашел работу, - разместить каждый элемент TR внутри него собственный элемент TBODY и применить правила разрыва страницы к элементу TBODY через css

Ответ 8

Попробуйте

white-space: nowrap; 

style to td, чтобы он не разбился на новые строки.

Ответ 9

Я обнаружил, что page-break-inside: avoid не будет работать, если любой из родительских элементов таблицы - display: inline-block или flex. Убедитесь, что все родительские элементы display: block.

Также рассмотрите возможность переопределения стилей table, tr, td display с помощью CSS grid для макета печати, если у вас по-прежнему возникают проблемы с таблицей.