Як застосувати розрив сторінки CSS для друку таблиці з великою кількістю рядків?


80

У мене на веб-сторінці є динамічна таблиця, яка іноді містить багато рядків. Я знаю , що є page-break-beforeі page-break-afterвластивість CSS. Куди їх вставити у свій код, щоб примусити розбивати сторінки, якщо це потрібно?

Відповіді:


137

Ви можете використовувати наступне:

<style type="text/css">
   table { page-break-inside:auto }
   tr    { page-break-inside:avoid; page-break-after:auto }
</style>

Для отримання детальної інформації зверніться до специфікації профілю друку CSS W3C .

А також перегляньте форуми розробників Salesforce .


8
Якщо ви пробуєте це за допомогою такого фреймворку, як bootstrap, майте на увазі, що використання чогось на зразок .spanX (який містить стилі з плаваючою формою) може порушити атрибути page-break- *, я втратив багато часу на цей маленький нюанс.
джаредсміт

1
це працює з UIWebView, тому я припускаю, що зараз це буде працювати і з Safari
JonEasy

Девід дякує, що поділився рішенням для роботи з сафарі або харом. JonEasy, ви можете використовувати рішення David, якщо це рішення не працює з Safari. @Maxence рада, що це допомогло. На жаль, я не був активний кілька місяців, тому не зміг відповісти достроково.
Hemant Metalia

2
Це рішення не розбиває багаторядкові комірки чітко між кордонами комірок, а розбиває їх посередині. Однак я знайшов рішення, яке працює у всіх поточних браузерах (Safari, FF та Chrome): stackoverflow.com/a/47498775/43615
Томас Темпельманн

1
@Saif ця відповідь була надана кілька років тому, можливо, вона не відповідає новим версіям браузера. але ви можете отримати підказку через це.
Hemant Metalia

23

Скрізь , де ви хочете застосувати перерву, або tableчи trви потрібно дати клас напр. page-breakіз CSS, як зазначено нижче:

/* class works for table row */
table tr.page-break{
  page-break-after:always
} 

<tr class="page-break">

/* class works for table */
table.page-break{
  page-break-after:always
}

<table class="page-break">

і це буде працювати, як ви вимагали

Крім того, ви також можете мати divструктуру для того ж:

CSS:

@media all {
 .page-break  { display: none; }
}

@media print {
 .page-break  { display: block; page-break-before: always; }
}

Розділ:

<div class="page-break"></div>

17
Це працює, лише якщо ви заздалегідь точно знаєте, скільки рядків поміститься на сторінці (оскільки вам потрібно оголошувати розриви сторінки безпосередньо у своїй розмітці). Це може бути складно (або неможливо), якщо існує можливість того, що дані в рядку таблиці можуть перенестися на другий рядок. А як щодо кількох розмірів сторінок (A4 проти US Letter проти US Legal)?
aapierce

Це рішення не працювало для мене при використанні багаторядкових комірок та кількох стовпців. Однак я знайшов рішення для цього: stackoverflow.com/a/47498775/43615 - Він також стосується проблеми, про яку згадує @aapierce.
Томас Темпельманн

1
Не вдалося змусити зламати trроботу в Chrome v64.
Кай Ноак

15

Я подивився навколо, щоб виправити це. У мене є мобільний сайт jquery, який має остаточну сторінку для друку, і він об’єднує десятки сторінок. Я спробував усі виправлення вище, але єдине, до чого я міг приступити до роботи, це:

<div style="clear:both!important;"/></div>
<div style="page-break-after:always"></div> 
<div style="clear:both!important;"/> </div>

Це робота в таблиці, якщо цей html ставив між двома тегами TR (CHROME). Це НЕ працює в таблиці, якщо цей html ставив між двома тегами TR (FIREFOX). У FileFox працює CSS Rule-> таблиця tr: nth-child (10) {page-break-after: always; page-break-inside: уникати;}
andrejs82

8

На жаль, наведені вище приклади не працювали для мене в Chrome.

Я придумав наведене нижче рішення, де ви можете вказати максимальну висоту в PX кожної сторінки. Потім таблиця буде розділена на окремі таблиці, коли рядки дорівнюють цій висоті.

$(document).ready(function(){

    var MaxHeight = 200;
    var RunningHeight = 0;
    var PageNo = 1;

    $('table.splitForPrint>tbody>tr').each(function () {

        if (RunningHeight + $(this).height() > MaxHeight) {
            RunningHeight = 0;
            PageNo += 1;
        }

        RunningHeight += $(this).height();

        $(this).attr("data-page-no", PageNo);

    });

    for(i = 1; i <= PageNo; i++){

        $('table.splitForPrint').parent().append("<div class='tablePage'><hr /><table id='Table" + i + "'><tbody></tbody></table><hr /></div>");

        var rows = $('table tr[data-page-no="' + i + '"]');

        $('#Table' + i).find("tbody").append(rows);
    }
    $('table.splitForPrint').remove();

});

Вам також знадобиться нижче у вашій таблиці стилів

    div.tablePage {
        page-break-inside:avoid; page-break-after:always;            
    }

Нічого не робить, коли таблиця має один великий рядок.
Кріс

1

це працює для мене:

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

З цієї теми: уникайте розриву сторінки всередині рядка таблиці


це працює певною мірою. Означає його зупинку обрізання даних у рядку внизу. Рядок його ще ріже. але принаймні кращий за фактичний випуск
aviboy2006,

0

Якщо ви знаєте, скільки ви хочете на сторінці, ви завжди можете це зробити. Він почне нову сторінку після кожного 20-го елемента.

.row-item:nth-child(20n) {
    page-break-after: always;
    page-break-inside: avoid;
}

Це не працює для мене :( Я використовую CHOME 83.0.4103.116
andrejs82

0

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

Хоча це не технічне рішення, воно вирішило мою проблему - просто закінчити таблицю, коли таблиця мені більше не потрібна; потім розпочав новий для нижнього колонтитула.

Сподіваюся, це комусь допоможе ... удачі!


-1

Ось приклад:

Через css:

<style>
  .my-table {
    page-break-before: always;
    page-break-after: always;
  }
  .my-table tr {
    page-break-inside: avoid;
  }
</style>

або безпосередньо на елементі:

<table style="page-break-before: always; page-break-after: always;">
  <tr style="page-break-inside: avoid;">
    ..
  </tr>
</table>

Це успішно використовує 4 сторінки для фактично 2-сторінкової таблиці і, схоже, має такий самий ефект, як відсутність css у Safari (6) та Chrome (24).
Девід

-2

Ви повинні використовувати

<tbody> 
  <tr>
  first page content here 
  </tr>
  <tr>
  ..
  </tr>
</tbody>
<tbody>
  next page content...
</tbody>

І CSS:

tbody { display: block; page-break-before: avoid; }
tbody { display: block; page-break-after: always; }

1
Розділення таблиці на сторінки вручну не є дуже хорошим рішенням, якщо вміст не є тим, що, природно, слід друкувати на окремих сторінках (наприклад, фінансова інформація, надрукована на одній сторінці на рік.) Ви заздалегідь не знаєте, скільки вмісту вміститься на одній друкована сторінка.
JJJ,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.