уникати розриву сторінки всередині рядка таблиці


97

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


1
Вибачте, в чому проблема при використанні page-break-inside: avoid;?
Крістіан

2
@ChristianVarga, коли я використовую розбиття сторінки: уникайте tr, це не працює
Ankit Mittal

1
Сторінка, що розбивається на таблиці, досить помилкова. Погляньте на це обхідне рішення JavaScript code.google.com/p/wkhtmltopdf/issues/detail?id=168#c4
Jona

2
насправді я пробував page-break-inside:avoidз усіма елементами таблиці, такими як tr td, але це не спрацювало.
Ankit Mittal

3
Yay Google для WebGL, сліпучий швидкий javascript, портативний власний клієнт, але ми все ще не можемо надрукувати таблиці даних. Кому це потрібно буде робити ??? Лише майже кожен бізнес у світі. До речі, я намагався надрукувати електронну таблицю в google docs зараз, і вона постійно збиває мій хром. Я думаю, google docs друкує через pdf. : /
Сем Уоткінс

Відповіді:


74

Ви можете спробувати це за допомогою 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>мітки в них , як правило , роблять дозволяють цей вид специфікації - і ви можете легко застосувати такі правила для всіх дітей - <tr>х і <td>Ти з допомогою CSS , як показано вище.


18
На жаль, це (поки) не працює з браузерами на базі webkit.
Аттіла Фулоп,

2
Так - є деякі дивацтва. Дивіться відповідь @ Peter у цьому питанні: stackoverflow.com/questions/7706504/… для отримання додаткової інформації.
Трой Алфорд,

3
Це працює тільки якщо ви берете на себе всю таблицю, а не просто тр / TD: stackoverflow.com/a/13525758/729324
marcovtwout

1
Я стикався з проблемами в IE8, можливо, в інших, де це призводить до того, що вся таблиця намагається вміститися на одній сторінці і відсікає будь-яке переповнення. Також здавалося, що ігнорується параметр "масштабувати відповідно" для цих таблиць.
Том П'єтросанті

6
@AttilaFulop Все-таки? Твоєму посту 3 роки, і я все ще не можу змусити його працювати. Дякую
повтор

32

Найкращий спосіб вирішити цю проблему у браузерах webkit - це помістити div всередину кожного елемента td та застосувати сторінку-break-inside: уникайте стилю до 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 і будь-що всередині нього не будуть.


Я margin: 4px 0 4px 0;зробив трюк для мене, я часом втрачав рекорд. Дякую
Wartodust

Проблема такого підходу полягає в тому, що іноді лише кілька комірок рядка перебиваються на наступну сторінку, хоча кожна комірка сама по собі не буде зламана.
WorldSEnder

@WorldSEnder Так. Ви знайшли для цього роботу?
ranjansaga

4
Не працює. Нічого не працює. Я спробував кожне "рішення" в Інтернеті, і рішення не існує. Нам просто потрібно прийняти лайно програмне забезпечення, яке не може навіть відтворити таблицю.
Ніклас Р.

17

Я використав трюк 4px від @AaronHill вище ( посилання ), і він спрацював дуже добре! Я використовував, проте, простіше правило css без необхідності додавати клас до кожного <td>в таблиці.

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

10

Я знайшов новий спосіб вирішити цю проблему, принаймні для мене (Версія Chrome 63.0.3239.84 (Офіційна збірка) (64-розрядна версія) на MacOS Sierra)

Додайте правило CSS до батьківської таблиці:

table{
    border-collapse:collapse;
}

а для td:

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

Я насправді знайшов це рішення на Stack Overflow, але воно не відображалося в початкових пошукових запитах Google: CSS, щоб зупинити розрив сторінки всередині рядка таблиці

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


вирішено питання вирізання рядка столу,
розбито

9

Використання CSS-прориву сторінки не буде працювати (це проблема веб-браузера).

Існує хак wkhtmltopdf для розділення таблиць JavaScript, який автоматично розбиває довгу таблицю на менші таблиці залежно від розміру сторінки, який ви вказали (а не розбиття сторінки після статичного значення x рядків): https://gist.github.com/3683510


Цей хак js спрацює, якщо я просто хочу роздрукувати веб-сторінку без wkhtmltopdf?
120196,

Це єдиний, який працював у мене. Також працює з бібліотекою HTML-PDF.
gilbert-v

8

Я написав такий 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.


1
Я передаю великі таблиці у формат PDF за допомогою wkhtmltopdf, і це єдине рішення, яке дало прийнятні результати. Може бути і краще (Webkit не повторює межі комірок після розриву сторінки), але принаймні вміст є. Дякую!
Джонатан Хілл

7

Єдиний спосіб, яким я виявив свою роботу, - це розмістити кожен елемент TR всередині власного елемента TBODY і застосувати правила розриву сторінки до елемента TBODY через css


1
Для мене це працює краще за все у Chromium версії 40.0.2214.111 (64-розрядна) на Arch Linux. Це негарно і відчуває Hacky - але , мабуть , кілька tbodyелементів дійсні всередині table stackoverflow.com/questions/3076708 / ...
ElDog

У мене це не працює (Chrome 56.0.2924.87 (64-розрядна версія), Mac OS 10.12.2).
Nhat Dinh,

4

Спробуйте

white-space: nowrap; 

style to td, щоб уникнути його злому на нових рядках.


1
Набагато простіше, ніж інші рішення. Це нова річ?
bendecko

3

Я виявив, що page-break-inside: avoidце не буде працювати, якщо будь-який з батьківських елементів таблиці є display: inline-blockабо flex. Переконайтеся, що всі батьківські елементи є display: block.

Також розглянемо перевизначення table, tr, td«s displayстилів з допомогою CSS gridдля макета друку , якщо ви зберігаєте виникли проблеми з таблицею.


3

Рішення 2020 року

Єдине, що я міг постійно працювати у всіх браузерах, це поміщати кожен рядок всередину власного елемента таблиці . Це також працює з вузлом HTML-PDF. Тоді просто встановіть все на page-break-inside: avoid.

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

Єдиним недоліком цього є те, що потрібно вручну встановлювати ширину стовпців, інакше це виглядає досить дивно. Наступне добре працювало для мене з двома колонками.

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


Приклад

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

Не могли б ви навести приклад таблиці HTML? Дякую.
PavanBhushan

Дякую, @ gilbert-v за редагування з прикладом. Я спробую це.
ПаванБхушан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.