[wkhtmltopdf] wkhtmltopdf의 테이블 행 내부에서 페이지 나누기를 방지하는 방법

하나의 테이블이있는 html 페이지에서 pdf 보고서를 생성하고 있습니다.

나는 목적으로 wkhtmltopdf 를 사용하고 있습니다.

pdf가 생성되면 tr 태그의 어느 곳에서나 중단 됩니다.

나는 그것을 피하고 싶다.



답변

업데이트 17.09.2015 : 사용중인 버전을 확인하십시오. wkhtmltopdf 0.12.2.4가 문제를 해결한다고합니다 (확인하지 않았습니다) .


이것은 wkhtmltopdf의 알려진 문제입니다. 웹킷 (WKhtmltopdf의 WK)에서 사용하는 페이지 나누기 알고리즘은 실제로 큰 테이블에서 제대로 작동하지 않습니다. 테이블을 페이지로 더 쉽게 분할하고 CSS를 많이 사용하는 작은 청크로 분할하는 것이 좋습니다.

table, tr, td, th, tbody, thead, tfoot {
    page-break-inside: avoid !important;
}

또한 다음 wkhtmltopdf 문제를 살펴보십시오. 예를 들어 테이블 분할 문제를 논의하는 흥미로운 주석이 있습니다. 도움이 될 수있는 168 테이블을 프로그래밍 방식으로 분할하는 JS 솔루션이 있습니다 (하지만 사용하지는 않습니다).

업데이트 08.11.2013
위에 링크 된 168 ​​호에서 이에 대한 많은 논의가 있습니다. 누군가가 더 나은 테이블 분할을 지원하는 wkhtmltopdf 버전을 컴파일했지만 안타깝게도 공식적으로 릴리스되지 않았으며 다른 버그가 포함될 수 있습니다. 나는 그것을 얻는 방법을 모르고 Windows에서 컴파일하는 방법을 모르지만 관심있는 사람은 여기 에서 주석을 확인할 수 있습니다 (아래의 새 업데이트 참조).

업데이트 24.02.2014
wkhtmltopdf 0.12에서이 기능이 크게 개선되었다는 소식을 듣고 기뻐하실 것입니다. 그러나 새 버전을 사용하기 전에 0.12.1을 기다렸다가 철저히 테스트하십시오. 안티 알 리즈로 작업하는 새 직원이 훌륭한 작업을 수행하고 있지만 (ashkulz 바위) 여전히 약간 불안정합니다! wkhtmltopdf.orggithub 에서 계속 업데이트하십시오 . Google 코드 사이트는 더 이상 사용되지 않으며 천천히 마이그레이션됩니다.


답변

오래된 게시물이지만 적절한 해결책을 찾으려고 많은 시간을 낭비했기 때문에 여기에 넣을 것입니다. 아마도 누군가에게 유용 할 것입니다.

그래서 내가 읽은 것에서 문제는

page-break-inside: avoid

작동하지 않는다는 것입니다. 그러나 실제로 display:block예상대로 작동 하는 요소에 설정하면 (SO 어딘가에서 언급했듯이). 그래서 테이블 css의 간단한 구조를 위해

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

및 테이블 구조

<table>
....
<tr>
    <td><div>some text</div></td>
    <td><div>more text</div></td>
</tr>
....
</table>

예상대로 작동합니다.

행 범위에 대해 좀 더 복잡한 경우가 있었기 때문에 위의 솔루션은 원하는 효과가 아닌 평화를 깨뜨리는 것이 었습니다. 나는 각 행에 걸친 행 세트에 대해 div를 사용하여 해결했습니다. 내 jquery js는 모든 작업을 수행합니다.

$(window).load(function () {
    var sizes = {};
    $('#the_table tr:first th').each(function (a, td) {
        var w = $(td).width();
        if (sizes.hasOwnProperty('' + a)) {
            if (sizes['' + a] < w)
                sizes['' + a] = w;
        }
        else {
            sizes['' + a] = w;
        }
    });

    var tableClone = $('#the_table').clone();
    $('#the_table').replaceWith('<div class="container"></div>');

    var curentDivTable;
    var cDiv = $('.container');
    tableClone.find('tr').each(function (i, ln) {
        var line = $(ln);
        if (line.hasClass('main_row')) {
            var div = $('<div class="new-section"><table><tbody>')
            currentDivTable = div.find('tbody');
            cDiv.append(div);
        }
        currentDivTable.append(line);
    });
    //optional - maybe in % its better than px
    var sum = 0;
    $.each(sizes, function (a, b) {
        sum += b;
    });
    var widths = {};
    $.each(sizes, function (a, b) {
        var p = Math.ceil(b * 100 / sum);
        widths['' + a] = p + '%';
    });
    //setup
    $('.container table').each(function (a, tbl) {
        $(tbl).find('tr:first td, tr:first th').each(function (b, td) {
            $(td).width(widths['' + b]);
        });
        $(tbl).addClass('fixed');
    });
});

CSS :

div.new-section {
    page-break-inside: avoid;
}
.container, .new-section, .new-section table.fixed{
    width: 100%;
}

.new-section table.fixed{
    table-layout:fixed;
}

모든 것이 필요한지 모르겠고 완벽하다고 생각하지는 않지만 일을합니다. 크롬에서만 테스트


답변

0.12부터이 문제가 해결되었지만 때로는 표가 너무 길어서 페이지에 맞지 않는 경우 wkhtmltopdf가 표를 두 부분으로 나누고 새 페이지의 열 머리글을 반복하며 이러한 열 머리글은 첫 번째 행에 겹쳐서 나타납니다.

wkhtmltopdf github 문제 섹션에서이 문제에 대한 일시적인 해결책을 찾았습니다 :
https://github.com/wkhtmltopdf/wkhtmltopdf/issues/2531

뷰 CSS에 다음 줄을 추가하십시오.

tr {
  page-break-inside: avoid;
}


답변

나는 며칠 동안이 문제를 파헤 쳤고 마침내 완벽한 해결책을 찾았습니다. 이 프로젝트 phpwkhtmltopdf를 참조 할 수 있습니다 . 디렉토리를 살펴보면 article3 가지 문제에 대한 3 가지 해결책을 찾을 수 있습니다. 요컨대, 궁극적 인 해결책은 CSS 스타일을 추가하는 것입니다.

thead {
    display: table-row-group;
}
tr {
    page-break-before: always;
    page-break-after: always;
    page-break-inside: avoid;
}
table {
    word-wrap: break-word;
}
table td {
    word-break: break-all;
}

당신이있는 거 중국어,이 사이트에 확인해 주시기 바랍니다 경우关于wkhtmltopdf을你一定想知道这些
원하는 경우 요점을 확인 wkhtmltopdf에 대한 요점을


답변

wkhtmltopdf 0.12.2.1 이상으로이 문제가 해결되었음을 알았습니다.


답변

내 특별한 경우 어떤 이유로 이전 답변 중 어느 것도 나를 위해 일하지 않았습니다. 결국 작동하게 된 것은 실제로 여러 가지의 조합이었습니다.

  1. pip3을 사용하여 pdfkit 이라는 Wkhtmltopdf 파이썬 래퍼를 설치했습니다 (Ubuntu 16.04에서) , apt-get을 통해 Wkhtmltopdf를 설치하는 대신 여기 에서 가져온 아래 스크립트에 따라 정적 바이너리 (버전 0.12.3)를 설치했습니다 .

    #!/bin/sh
    
    sudo apt-get install -y openssl build-essential xorg libssl-dev
    wget http://download.gna.org/wkhtmltopdf/0.12/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
    tar -xJf wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
    cd wkhtmltox
    sudo chown root:root bin/wkhtmltopdf
    sudo cp -r * /usr/
    
  2. 이 CSS를 추가했습니다 (여기 답변 중 하나에서 제 안됨).

    tr, td div, th div{
        page-break-inside: avoid;
    }
    
  3. 그런 다음 여기에 제안 된대로 및 태그 추가 합니다 (이들 없이도 테이블은 추악한 방식으로 깨질 것입니다).<thead><tbody>

    <table>
        <thead>
            <tr>
                <th>Column 1</th>
                <th>Column 2</th>
            </tr>
        </thead>
    
        <tbody>
            <tr>
                <td>Value 1</td>
                <td>Value 2</td>
            </tr>
        </tbody>
    </table>
    

이러한 수정을 통해 이제 Mako 템플릿 을 성공적으로 사용 하여 HTML을 생성 한 다음 Wkhtmltopdf에 피드하고 아름다운 페이지가 매겨진 PDF를 얻을 수 있습니다.


답변

테이블에 대한 모든 조작을 시도했지만 페이지 나누기가 행 중간에 들어가는 것을 막을 수있는 방법은 없습니다. 필사적으로 다른 버전을 시도해 보았고 다음을 발견했습니다.

Wkhtmltopdf 0.12.2.1 : 나쁨

Wkhtmltopdf 0.12.3 : 나쁨

Wkhtmltopdf 0.12.1 : 좋음

내 해결책은 버전 0.12.1로 다운 그레이드하는 것이 었는데, 이로 인해 문제가 해결되었습니다. 물론, 그것들은 부분적으로 내 html에 대한 강박증이 아니었기 때문일 수도 있지만 HTML이 TinyMCE (사용자에 의해) 내부에서 생성되기 때문에 선택의 여지가별로 없습니다.

또한 중첩 테이블은 어떤 버전에서도 작동하지 않습니다.