избегайте разрыва страницы внутри строки таблицы
Я хочу избежать разрыва страницы внутри строки таблицы в html, когда я конвертирую html в PDF с помощью wkhtmltopdf. Я использую page-break-inside: избегайте с таблицей-ее работы, но у меня так много строк, тогда не получится. Если установить отображение tr как блок или что-то еще, то это изменить форматирование таблицы и вставить двойную границу. Или можно вставить заголовок таблицы на каждой странице, где таблица была разделена.
8 ответов:
вы можете попробовать это с помощью 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 разрешить такого рода спецификации - и вы можете легко применить такие правила ко всем дочерним -<tr>
и<td>
использует CSS, как показано выше.
лучший способ, который я нашел для решения этой проблемы в браузерах webkit, - это поместить div внутри каждого элемента td и применить page-break-inside: avoid style к 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 предположительно не распознает свойство " page-break-inside: avoid;", это, по-видимому, удерживает содержимое строки от разделения пополам разрывом страницы при использовании wktohtml для создания PDF-файлов. Элемент tr может немного зависать над страницей, но div и все такое внутри его не будет.
я использовал трюк 4px от @AaronHill выше (ссылке) и это сработало очень хорошо! Я использовал, хотя более простое правило css без необходимости добавлять класс к каждому
<td>
в таблице.@media print { table tbody tr td:before, table tbody tr td:after { content : "" ; height : 4px ; display : block ; } }
Я написал следующий 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 (опять же, приписываемым Аарону Хиллу):
.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.
использование CSS page-break-inside не будет работать (это проблема браузера webkit).
существует wkhtmltopdf JavaScript таблица расщепления hack который разбивает длинную таблицу на меньшие таблицы автоматически в зависимости от размера страницы вы указываете (а не разрыв страницы после статического значения x строк):https://gist.github.com/3683510
единственный способ, который я нашел для работы, - это поместить каждый элемент TR внутри его собственного элемента TBODY и применить правила разрыва страницы к элементу TBODY через css
Я нашел новый способ решить эту проблему, по крайней мере для меня (Chrome версии 63.0.3239.84 (официальная сборка) (64-бит) на MacOS Sierra)
добавьте правило CSS в родительскую таблицу:
table{ border-collapse:collapse; }
и тд:
tr td{ page-break-inside: avoid; white-space: nowrap; }
Я действительно нашел это решение в Stack Overflow, но оно не появилось в первоначальных поисках Google: CSS, чтобы остановить разрыв страницы внутри строки таблицы
Слава @Ibrennan208 за решение проблемы!