테이블 행 내부에서 페이지 나누기 방지


97

wkhtmltopdf로 html을 PDF로 변환 할 때 html의 테이블 행 내부에서 페이지 나누기를 피하고 싶습니다. 나는 page-break-inside : avoid with table- 그 작품을 사용하지만 너무 많은 행이 있고 작동하지 않습니다. tr의 표시를 블록이나 다른 것으로 설정하면 테이블의 서식을 변경하고 이중 테두리를 삽입합니다. 또는 테이블이 분할 된 각 페이지에 테이블 머리글을 삽입 할 수 있습니다.


1
죄송합니다. 사용할 때 어떤 문제가 page-break-inside: avoid;있습니까?
Christian

2
나는 페이지 나누기 - 내부를 사용할 때 @ChristianVarga : TR과 피할를 작동하지입니다
ANKIT 미탈

1
표로 나누는 페이지는 매우 버그가 있습니다. 이 JavaScript 해결 방법을 살펴보십시오. code.google.com/p/wkhtmltopdf/issues/detail?id=168#c4
Jona

2
실제로 page-break-inside:avoidtr td와 같은 모든 테이블 요소로 시도했지만 작동하지 않았습니다.
Ankit Mittal 2012

3
Yay Google for WebGL, 눈부신 빠른 자바 스크립트, 휴대용 네이티브 클라이언트,하지만 여전히 데이터 테이블을 인쇄 할 수 없습니다. 누가해야할까요 ??? 전 세계의 거의 모든 비즈니스에 불과합니다. 덧붙여서, 방금 Google 문서에서 스프레드 시트를 인쇄하려고했는데 계속해서 크롬이 충돌합니다. Google 문서는 pdf를 통해 인쇄한다고 생각합니다. : /
Sam Watkins 2014 년

답변:


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>그 안에 태그는 일반적으로 사양의이 종류를 할 수 - 당신은 쉽게 ALL에 자식 - 같은 규칙을 적용 할 수 <tr>의 및 <td>위의 그림과 같이의 사용 CSS를.


18
불행히도 이것은 (아직) 웹킷 기반 브라우저에서 작동하지 않습니다.
Attila Fulop 2013 년

2
예-몇 가지 이상한 점이 있습니다. 참조 @ 베드로의이 질문에 답 : stackoverflow.com/questions/7706504/...을 좀 더 정보를 원하시면.
Troy Alford 2013 년

3
: 당신이 전체 테이블뿐만 아니라 TR / TD 걸릴 경우에만 작동 stackoverflow.com/a/13525758/729324
marcovtwout

1
IE8에서이 문제가 발생했습니다. 다른 문제로 인해 전체 테이블이 한 페이지에 들어가도록하고 오버플로를 차단합니다. 또한 이러한 테이블에 대한 "크기에 맞게 조정"옵션을 무시하는 것처럼 보였습니다.
Tom Pietrosanti 2014 년

6
@AttilaFulop 아직도? 귀하의 게시물은 3 년이 지났지 만 여전히 작동하지 않습니다. 감사합니다
취소

32

웹킷 브라우저에서이 문제를 처리하는 가장 좋은 방법은 각 td 요소 안에 div를 넣고 page-break-inside : avoid style to the 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>

비록 크롬이 'page-break-inside : avoid;'를 인식하지 못하더라도 속성, 이것은 wktohtml을 사용하여 PDF를 생성 할 때 페이지 나누기에 의해 행 내용이 반으로 분할되는 것을 방지하는 것 같습니다. tr 요소는 페이지 나누기 위에 약간 걸릴 수 있지만 div 및 그 안의 모든 요소는 그렇지 않습니다.


margin: 4px 0 4px 0;내가 가끔 기록을 잃고, 나를 위해 트릭을했다. 감사합니다
Wartodust

이 방법의 문제점은 행의 일부 셀만 다음 페이지로 분할되지만 각 셀 자체가 분할되지는 않는다는 것입니다.
WorldSEnder

@WorldSEnder 예. 이것에 대한 해결 방법을 찾았습니까?
ranjansaga

4
작동하지 않습니다. 아무것도 작동하지 않습니다. 인터넷에서 모든 "솔루션"을 시도했지만 솔루션이 없습니다. 우리는 테이블을 렌더링 할 수없는 쓰레기 소프트웨어를 받아 들여야합니다.
Niklas R.

18

위의 @AaronHill ( link ) 의 4px 트릭을 사용 했으며 정말 잘 작동했습니다! <td>테이블의 각 클래스에 클래스를 추가 할 필요없이 더 간단한 CSS 규칙을 사용했습니다 .

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

10

나는 적어도 나를 위해이 문제를 해결하는 새로운 방법을 찾았습니다 (MacOS Sierra의 Chrome 버전 63.0.3239.84 (공식 빌드) (64 비트))

상위 테이블에 CSS 규칙을 추가합니다.

table{
    border-collapse:collapse;
}

그리고 td의 경우 :

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

실제로 Stack Overflow에서이 솔루션을 찾았지만 초기 Google 검색에는 표시되지 않았습니다. 테이블 행 내부에서 페이지 나누기를 중지하는 CSS

문제를 해결 한 @ Ibrennan208에게 찬사를 보냅니다!


절단 테이블의 해결 문제는 휴식 다른 디자인을 행
aviboy2006

9

CSS page-break-inside 사용이 작동하지 않습니다 (웹킷 브라우저 문제).

지정한 페이지 크기에 따라 자동으로 긴 테이블을 작은 테이블로 나누는 wkhtmltopdf JavaScript 테이블 분할 해킹이 있습니다 (x 행의 정적 값 이후 페이지 나누기 대신) : https://gist.github.com/3683510


이 js 해킹은 wkhtmltopdf없이 웹 페이지를 인쇄하려는 경우 작동합니까?
120196

이것은 나를 위해 일한 유일한 사람입니다. HTML-PDF 라이브러리에서도 작동합니다.
gilbert-v

8

Aaron Hill의 답변을 기반으로 다음 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에서 잘 작동하는 것 같습니다.


1
wkhtmltopdf를 사용하여 큰 테이블을 PDF 형식으로 렌더링하고 있는데 이것이 허용 가능한 결과를 산출 한 유일한 솔루션입니다. 더 좋을 수도 있지만 (Webkit은 페이지 나누기 후에 셀 테두리를 반복하지 않음) 적어도 콘텐츠는 거기에 있습니다. 감사!
Jonathon Hill

7

내가 찾은 유일한 방법은 각 TR 요소를 자체 TBODY 요소 안에 배치하고 CSS를 통해 TBODY 요소에 페이지 나누기 규칙을 적용하는 것입니다.


1
이것은 Arch Linux의 Chromium 버전 40.0.2214.111 (64 비트)에서 나머지 것보다 잘 작동합니다. 그것은 추한 및 해키 느낌 -하지만 분명히 여러 tbody요소는 내부 유효 table stackoverflow.com/questions/3076708/...
ElDog

저에게는 작동하지 않습니다 (Chrome 56.0.2924.87 (64 비트), Mac OS 10.12.2).
Nhat Dinh

4

시도

white-space: nowrap; 

스타일을 td로 변경하여 새 줄에서 끊어지지 않도록합니다.


1
다른 솔루션보다 훨씬 간단합니다. 이것은 새로운 것입니까?
bendecko

3

page-break-inside: avoid테이블의 부모 요소가 display: inline-block또는 인 경우 작동하지 않는 것으로 나타났습니다 flex. 모든 상위 요소가display: block .

또한 재정을 고려 table, tr, tddisplayCSS에 스타일 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에게 감사드립니다. 나는 이것을 시도 할 것이다.
PavanBhushan

0

이것은 오래된 질문이지만 최근에 동일한 오류가 발생했습니다. 제 경우의 문제 table-responsive는 우연히 <table>요소 에 사용 된 Bootstrap의 클래스 와 관련이 있습니다.

따라서 동일한 문제가있는 경우 wkhtmltopdf를 호출 할 때 클래스 table-responsive에서 제거해보십시오 <table>.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.