テーブルの行内で改ページを避ける


97

htmlをwkhtmltopdfでPDFに変換するときに、htmlのテーブルの行内の改ページを回避したいと思います。私はpage-break-inside:avoid with table-を使用していますが、行が多すぎて機能しません。trの表示をブロックまたはその他のものとして設定すると、テーブルのフォーマットが変更され、二重の境界線が挿入されます。または、テーブルが分割された各ページにテーブルヘッダーを挿入することもできます。


1
申し訳ありませんが、使用時の問題は何page-break-inside: avoid;ですか?
クリスチャン

2
@ChristianVarga page-break-inside:avoid with trを使用すると機能しません
Ankit Mittal

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、目立たない高速のJavaScript、ポータブルネイティブクライアントですが、それでもデータテーブルを印刷できません。誰がそれを行う必要がありますか?世界のほぼすべてのビジネスのみ。ちなみに、Googleドキュメントでスプレッドシートを印刷しようとしたところ、いつもChromeがクラッシュしました。私はグーグルドキュメントが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>

<tr>上記で正確に指摘したとおり、ほとんどのCSSルールはタグに直接適用されdisplayません。これらのルールには、これらのCSSルールを許可しない独自のスタイルがあります。ただし、通常、その内部のタグ<td><th>タグこの種の指定を許可します。また、上記のようにCSSを使用して<tr>、すべての子とにそのようなルールを簡単に適用できます<td>


18
残念ながら、これは(まだ)Webkitベースのブラウザでは動作しません。
Attila Fulop、2013年

2
はい-いくつかの奇妙な点があります。この質問の@Peterの回答をご覧ください:詳細については、stackoverflow.com / questions / 7706504 / をご覧ください。
Troy Alford 2013年

3
それはあなたがテーブル全体を取る場合だけでなく、TR / TD作品:stackoverflow.com/a/13525758/729324
marcovtwout

1
IE8で問題が発生した可能性があります。おそらく他の問題もあり、テーブル全体が1ページに収まるようにしてオーバーフローを遮断します。また、これらのテーブルの「合わせる」オプションを無視するように見えました。
Tom Pietrosanti 2014年

6
@AttilaFulopまだですか?あなたの投稿は3歳ですが、それでも機能しません。ありがとう
2016年

32

Webkitブラウザーでこの問題に対処するために私が見つけた最良の方法は、各td要素内にdivを置き、page-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 2017年

@WorldSEnderはい。これの回避策は見つかりましたか?
ranjansaga 2017年

4
動作しません。何も動作しません。インターネットで「解決策」をすべて試しましたが、解決策はありません。テーブルをレンダリングすることさえできないがらくたソフトウェアを受け入れる必要があります。
Niklas R.

17

上記の@AaronHillによる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;
}

私は実際にこのソリューションをスタックオーバーフローで見つけましたが、最初のGoogle検索では表示されませんでした: テーブル行内の改ページを停止するCSS

問題を解決するための@ Ibrennan208への称賛!


カッティングテーブルの列の問題を解決し、他のデザインを壊す
aviboy2006

9

CSSのpage-break-insideを使用しても機能しません(これはWebkitブラウザーの問題です)。

指定したページサイズに応じて長いテーブルを自動的に小さなテーブルに分割するwkhtmltopdf JavaScriptテーブル分割ハックがあります(x行の静的な値の後にページを分割するのではなく):https : //gist.github.com/3683510


このjsハックは、wkhtmltopdfを使用せずにWebページを印刷する場合にのみ機能しますか?
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で使用します(これも、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 /…

これは私には機能しません(Chrome 56.0.2924.87(64ビット)、Mac OS 10.12.2)。
Nhat Dinh

4

で試す

white-space: nowrap; 

新しい行で改行しないようにtdのスタイル。


1
他のソリューションよりもはるかに簡単です。これは新しいことですか?
bendecko 2016

3

私はそれを発見したpage-break-inside: avoidテーブルの親要素のいずれかがいない作業しているかどうdisplay: inline-blockflex。すべての親要素がであることを確認してくださいdisplay: block

またオーバーライドを検討しtabletrtddisplayCSSでスタイルをgrid印刷レイアウトのためにあなたがテーブルで問題が発生し続ける場合。


2

2020ソリューション

すべてのブラウザで一貫して作業できる唯一のことは、各行を独自のテーブル要素内配置することです。これはノードHTML-PDFでも機能します。次に、すべてをに設定しますpage-break-inside: avoid

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

これの唯一の欠点は、列の幅を手動で設定する必要があることです。そうしないと、奇妙に見えます。次は、2つの列でうまく機能しました。

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

テーブルHTMLの例を提供できますか?ありがとう。
PavanBhushan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.