CSS 페이지 나누기를 적용하여 행이 많은 표를 인쇄하는 방법은 무엇입니까?


80

내 웹 페이지에 때때로 많은 행을 포함하는 동적 테이블이 있습니다. 나는 거기 알고 page-break-beforepage-break-afterCSS 속성. 필요한 경우 페이지를 강제로 나누기 위해 코드에 어디에 두어야합니까?

답변:


137

다음을 사용할 수 있습니다.

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

자세한 내용은 W3C의 CSS 인쇄 프로필 사양을 참조하십시오.

또한 Salesforce 개발자 포럼을 참조하십시오 .


8
부트 스트랩과 같은 프레임 워크로이 작업을 시도하는 경우 .spanX (float가있는 스타일)와 같은 것을 사용하면 page-break- * 속성이 중단 될 수 있으며이 작은 뉘앙스에 많은 시간을 낭비 할 수 있습니다.
jaredsmith 2014 년

1
있는 UIWebView이 작품은 지금 사파리이 것 또한 일을 가정 있도록
JonEasy

David는 safari 또는 charome과 함께 작동하는 솔루션을 공유해 주셔서 감사합니다. JonEasy이 솔루션이 Safari에서 작동하지 않는 경우 David의 솔루션을 사용할 수 있습니다. @ Maxence가 도움이되어 기쁩니다. 몇 달 동안 활동하지 않아서 일찍 응답하지 못해 죄송합니다.
Hemant Metalia

2
이 솔루션은 셀 경계 사이에서 여러 줄로 된 셀을 깨끗하게 분리하지 않고 중간에서 분리합니다. 하지만 현재의 모든 브라우저 (Safari, FF 및 Chrome)에서 작동하는 솔루션을 찾았습니다. stackoverflow.com/a/47498775/43615
Thomas Tempelmann 2017

1
@Sa이 답변이 몇 년 전에 제공 되었다면 최신 버전의 브라우저를 준수하지 않을 수 있습니다. 그러나 당신은 그것을 통해 약간의 힌트를 얻을 수 있습니다.
Hemant Metalia

23

휴식을 적용하려면 a table또는 tr, ex에 대한 클래스를 제공해야합니다. 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 2014

이 솔루션은 여러 줄 셀과 여러 열을 사용할 때 저에게 효과적이지 않았습니다. 그래도 해결책을 찾았습니다. stackoverflow.com/a/47498775/43615-@aapierce가 언급 한 문제도 다룹니다.
Thomas Tempelmann 2017

1
파괴 가져올 수 없습니다 tr크롬 V64에 하나가 작동을합니다.
Kai Noack

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) 사이에 있으면 테이블에서 작동하지 않습니다. {:; 피할 페이지 나누기 - 내부 항상 페이지 나누기 - 후} n 번째의 아이 (10) : FileFox 작업 CSS 규칙 -> 테이블 TR에서
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;            
    }

테이블에 하나의 큰 행이 있으면 아무 작업도 수행하지 않습니다.
Chris

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

그것은 나를 위해 작동하지 :( 나는 쵸메 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>

이것은 효과적으로 2 페이지 테이블에 대해 4 페이지를 성공적으로 사용하며 Safari (6) 및 Chrome (24)의 CSS가없는 것과 동일한 효과를 보입니다.
David

-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
콘텐츠가 자연스럽게 별도의 페이지에 인쇄되어야하는 경우 (예 : 1 년에 한 페이지 씩 인쇄되는 재무 정보)가 아니면 테이블을 페이지로 수동으로 나누는 것은 좋은 해결책이 아닙니다. 한 페이지에 얼마나 많은 콘텐츠가 들어갈 지 미리 알 수 없습니다. 인쇄 된 페이지.
JJJ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.