2017-11-24 6 views
2

印刷のためにうまくレンダリングされるようにプログラムでhtmlを生成します。複数のページにまたがる行を防ぐhtmlテーブルの印刷

複数のページにまたがる表を印刷する必要があります。これには、このような2つのページの上に広げるために、セルの内容を防止することなど、いくつかの課題を提起:

enter image description here

私は順番に<tr>要素に対してdisplay: blockを使用していますthis answerとともに、page-break-inside:avoidを使用していますthis answer内の溶液を、発見しましたそれらが垂直に分割されないようにします。

しかし、これによっても、行が互いに垂直に整列しないようになります。どうすれば修正できますか?

は、ここでそれがどのように見えるべきか(とブラウザが画面上にそれをレンダリングする方法)です:

enter image description here

そして、ここではそれが印刷のためにレンダリングするものです:

私はどのように

enter image description here

改ページ時に垂直方向にセルを維持する能力を失うことなく、画面上に整列した状態でプリントアウトを整列させます。それはMacOS上でWebkit(Safari)で動作する必要があります。

ここに完全なhtmlコードがあります。

<!DOCTYPE html><html><head><meta charset="utf-8"><style type="text/css"> 
th, td { border: 1px solid #aaa; } 
@media print { 
    table, tr, td, th { 
    page-break-inside: avoid; 
    } 
    tr { 
    display: block; 
    page-break-before: auto; 
    } 
} 
</style></head> 
<body> 
<table style="width:40%"> 
    <tr><th>A</th><th>B</th><th>C</th></tr> 
    <tr><td>more text<br>1<br>2<br>3<br>4<br>5<br></td><td>more text</td><td>more text</td></tr> 
    <tr><td>1<br>2<br>3<br>4<br>5<br>6<br></td><td>x</td><td>x</td></tr> 
    <tr><td>1<br>2<br>3<br>4<br>5<br>6<br></td><td>x</td><td>x</td></tr> 
    <tr><td>1<br>2<br>3<br>4<br>5<br>6<br></td><td>x</td><td>x</td></tr> 
    <tr><td>1<br>2<br>3<br>4<br>5<br>6<br></td><td>x</td><td>x</td></tr> 
    <tr><td>1<br>2<br>3<br>4<br>5<br>6<br></td><td>x</td><td>x</td></tr> 
    <tr><td>1<br>2<br>3<br>4<br>5<br>6<br></td><td>x</td><td>x</td></tr> 
    <tr><td>1<br>2<br>3<br>4<br>5<br>6<br></td><td>x</td><td>x</td></tr> 
    <tr><td>1<br>2<br>3<br>4<br>5<br>6<br></td><td>x</td><td>x</td></tr> 
    <tr><td>1<br>2<br>3<br>4<br>5<br>6<br></td><td>x</td><td>x</td></tr> 
</table> 
</body></html> 

アップデート:私もthis solutionを試してみました

が使用するものは、個々の細胞が(希望されていません)、次のページの1の半分ずつ現れるかどうかを確認できるように、2つのページにまたがりますtableの代わりにdiv

enter image description here

答えて

0

@media print { }

td, th { 
    width: 10000px; 
} 

を追加するコード例を機能させるためにトリックをした:これは(今のセルの高さがあまりにも、間違っている)印刷、それでも悪いことはわずかに異なる結果が得られます。

これで、印刷された列が正しく整列され、各行は1ページにとどまり、2ページにまたがることはありません。

ウェブキット(Safari)、FF、およびChromeのすべてのバージョンで動作します(すべてmacOSでテスト済み)。

警告:

残念ながら、上記の証拠を欺くされていません。各行のセルの幅が同じであるため、この例でのみ機能します。

これらの幅がランダムになると、10000pxなどのオーバーピクセルピクセル幅が列を再び乱してしまいます。

私がこれを見つけた唯一の解決策は、使用される実際の幅を提供することです。これは印刷用であり、特定の用紙フォーマット(DIN A4やUS Letterなど)に印刷することがわかっているので、列幅を正確に指定することができます。

したがって、このソリューションはブラウザの画面上のWebページビューには適していませんが、合計幅が変わる可能性がありますが、目標とする印刷サイズが予測できる限り、印刷に適しています。ここで

は4センチメートルに列幅を設定し、完全なhtmlコードで、2センチメートルと3センチメートル:

<!DOCTYPE html><html><head><meta charset="utf-8"><style type="text/css"> 
th, td { border: 1px solid #aaa; } 
@media print { 
    table, tr, td, th { 
    page-break-inside: avoid; 
    } 
    tr { 
    display: block; 
    page-break-before: auto; 
    } 
    td:nth-child(1), th:nth-child(1) { 
    width: 4cm; 
    } 
    td:nth-child(2), th:nth-child(2) { 
    width: 2cm; 
    } 
    td:nth-child(3), th:nth-child(3) { 
    width: 3cm; 
    } 
} 
</style></head> 
<body> 
<table> 
    <tr><th>A</th><th>B</th><th>C</th></tr> 
    <tr><td>more text<br>1<br>2<br>3<br>4<br>5<br></td><td>more text</td><td>more text</td></tr> 
    <tr><td>1 adasd<br>2<br>3<br>4<br>5<br>6<br></td><td>x</td><td>x</td></tr> 
    <tr><td>1<br>2<br>3<br>4<br>5<br>6<br></td><td>x</td><td>x</td></tr> 
    <tr><td>1<br>2<br>3<br>4<br>5<br>6<br></td><td>x</td><td>x</td></tr> 
    <tr><td>1asd<br>2<br>3<br>4<br>5<br>6<br></td><td>x</td><td>x</td></tr> 
    <tr><td>1<br>2<br>3<br>4<br>5<br>6<br></td><td>x</td><td>x</td></tr> 
    <tr><td>1<br>2<br>3<br>4<br>5<br>6<br></td><td>xsdsdfsf</td><td>x</td></tr> 
    <tr><td>1<br>2<br>3<br>4<br>5<br>6<br></td><td>x</td><td>x</td></tr> 
    <tr><td>1<br>2 asda asdas<br>3<br>4<br>5<br>6<br></td><td>xasdada</td><td>x</td></tr> 
    <tr><td>1<br>2<br>3<br>4 asdasd <br>5<br>6<br></td><td>x</td><td>x</td></tr> 
</table> 
</body></html> 
関連する問題