หลีกเลี่ยงการแบ่งหน้าภายในแถวของตาราง


99

ฉันต้องการหลีกเลี่ยงการแบ่งหน้าภายในแถวของตารางใน html เมื่อฉันแปลง html เป็น PDF โดย wkhtmltopdf ฉันใช้ page-break-inside: หลีกเลี่ยงด้วย table - มันใช้งานได้ แต่ฉันมีหลายแถวแล้วไม่ทำงาน หากตั้งค่าการแสดงtr เป็นบล็อกหรืออย่างอื่นมันจะเปลี่ยนการจัดรูปแบบของตารางและใส่เส้นขอบคู่ หรือเป็นไปได้ที่จะแทรกส่วนหัวของตารางในแต่ละหน้าซึ่งตารางถูกแยกออก


1
ขออภัยปัญหาขณะใช้งานpage-break-inside: avoid;คืออะไร?
คริสเตียน

2
@ChristianVarga เมื่อฉันใช้ page-break-inside: หลีกเลี่ยงด้วย tr มันไม่ทำงาน
Ankit Mittal

1
การทำลายหน้าด้วยตารางนั้นค่อนข้างมีปัญหา มีลักษณะที่นี้ JavaScript วิธีแก้ปัญหาcode.google.com/p/wkhtmltopdf/issues/detail?id=168#c4
Jona

2
ที่จริงฉันได้ลองpage-break-inside:avoidกับองค์ประกอบตารางทั้งหมดเช่น tr td แต่มันไม่ได้ผล
Ankit Mittal

3
ใช่ Google สำหรับ WebGL, จาวาสคริปต์ที่รวดเร็ว, ไคลเอนต์เนทีฟแบบพกพา แต่เรายังไม่สามารถพิมพ์ตารางข้อมูลได้ ใครจะต้องทำ ??? เพียงเกี่ยวกับทุกธุรกิจในโลก บังเอิญฉันพยายามพิมพ์สเปรดชีตใน Google เอกสารในขณะนี้และทำให้ Chrome ของฉันขัดข้องอยู่เสมอ ฉันคิดว่า Google เอกสารพิมพ์ผ่าน pdf : /
Sam Watkins

คำตอบ:


76

คุณอาจลองใช้ 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>แท็กภายในพวกเขามักจะทำช่วยให้ชนิดของข้อกำหนดนี้ - และคุณสามารถใช้กฎดังกล่าวไปทั้งหมด child- <tr>'และ<td>' s ใช้ CSS ที่แสดงข้างต้น


18
น่าเสียดายที่สิ่งนี้ใช้ไม่ได้กับเบราว์เซอร์ที่ใช้ webkit
Attila Fulop

2
ใช่ - มีบางอย่างที่แปลกประหลาด ดูคำตอบของ @ Peter ในคำถามนี้: stackoverflow.com/questions/7706504/…สำหรับข้อมูลเพิ่มเติม
Troy Alford

3
ใช้งานได้เฉพาะเมื่อคุณใช้ทั้งตารางไม่ใช่แค่ tr / td: stackoverflow.com/a/13525758/729324
marcovtwout

1
ฉันพบปัญหาเกี่ยวกับสิ่งนี้ใน IE8 ซึ่งอาจเป็นปัญหาอื่น ๆ ซึ่งทำให้ทั้งตารางพยายามทำให้พอดีกับหน้าเดียวและตัดส่วนที่ล้นออกไป ดูเหมือนว่าจะไม่สนใจตัวเลือก "ปรับขนาดให้พอดี" สำหรับตารางเหล่านี้
Tom Pietrosanti

6
@AttilaFulop ยัง? โพสต์ของคุณมีอายุ 3 ปีแล้ว แต่ฉันยังไม่สามารถใช้งานได้ ขอบคุณ
ถ่ายทอดอีกครั้งใน

34

วิธีที่ดีที่สุดที่ฉันพบในการจัดการกับปัญหานี้ในเบราว์เซอร์ webkit คือใส่ div ไว้ในแต่ละองค์ประกอบ td และใช้ 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 จะไม่รู้จัก 'page-break-inside: หลีกเลี่ยง;' คุณสมบัตินี้ดูเหมือนว่าจะป้องกันไม่ให้เนื้อหาแถวถูกแบ่งครึ่งโดยการแบ่งหน้าเมื่อใช้ wktohtml เพื่อสร้าง PDF องค์ประกอบ tr อาจค้างอยู่บนหน้าแตกเล็กน้อย แต่ div และอะไรก็ตามที่อยู่ข้างในจะไม่


margin: 4px 0 4px 0;ได้เคล็ดลับสำหรับผมได้สูญเสียการบันทึกเป็นครั้งคราว ขอบคุณ
Wartodust

ปัญหาเกี่ยวกับแนวทางนี้คือบางครั้งมีเพียงไม่กี่เซลล์ในแถวเท่านั้นที่ถูกทำลายไปยังหน้าถัดไปแม้ว่าแต่ละเซลล์จะไม่แตก
WorldSEnder

@WorldSEnder ใช่ คุณพบวิธีแก้ปัญหานี้หรือไม่?
ranjansaga

4
ไม่ทำงาน ไม่มีอะไรทำงาน ฉันลองทุก "วิธีแก้ปัญหา" บนอินเทอร์เน็ตและไม่มีทางแก้ไข เราต้องยอมรับซอฟต์แวร์อึที่ไม่สามารถแสดงตารางได้
Niklas R.

18

ฉันใช้เคล็ดลับ 4px โดย @AaronHill ด้านบน ( ลิงค์ ) และมันก็ใช้ได้ดีจริงๆ! ฉันใช้กฎ css ที่ง่ายกว่าโดยไม่จำเป็นต้องเพิ่มคลาสให้กับแต่ละ<td>ตารางในตาราง

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

10

ฉันพบวิธีใหม่ในการแก้ปัญหานี้อย่างน้อยสำหรับฉัน (Chrome เวอร์ชัน 63.0.3239.84 (รุ่นอย่างเป็นทางการ) (64 บิต) บน MacOS Sierra)

เพิ่มกฎ 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 จะไม่ได้ผล (นี่คือปัญหาของเบราว์เซอร์ webkit)

มีแฮ็คการแบ่งตาราง JavaScript wkhtmltopdf ซึ่งแบ่งตารางยาวออกเป็นตารางเล็ก ๆ โดยอัตโนมัติขึ้นอยู่กับขนาดหน้าที่คุณระบุ (แทนที่จะทำลายหน้าหลังจากค่าคงที่ x แถว): https://gist.github.com/3683510


การแฮ็ก js นี้จะใช้งานได้หากฉันต้องการพิมพ์หน้าเว็บโดยไม่ใช้ wkhtmltopdf?
120196

นี่เป็นเพียงคนเดียวที่ได้ผลสำหรับฉัน ใช้งานได้กับไลบรารี HTML-PDF
gilbert-v

8

ฉันเขียน JavaScript ต่อไปนี้ตามคำตอบของ Aaron Hill:

//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
ฉันกำลังแสดงตารางขนาดใหญ่ในรูปแบบ PDF โดยใช้ wkhtmltopdf และนี่เป็นวิธีเดียวที่ให้ผลลัพธ์ที่ยอมรับได้ อาจจะดีกว่า (Webkit จะไม่ทำซ้ำขอบเซลล์หลังจากแบ่งหน้า) แต่อย่างน้อยก็มีเนื้อหาอยู่ ขอบคุณ!
Jonathon Hill

7

วิธีเดียวที่ฉันพบว่าได้ผลคือวางองค์ประกอบ TR แต่ละองค์ประกอบไว้ในองค์ประกอบ TBODY ของตัวเองและใช้กฎการแบ่งหน้ากับองค์ประกอบ TBODY ผ่าน css


1
สิ่งนี้ใช้งานได้ดีกว่าส่วนที่เหลือสำหรับฉันใน Chromium เวอร์ชัน 40.0.2214.111 (64 บิต) บน Arch Linux มันน่าเกลียดและให้ความรู้สึกแฮ็ค - แต่เห็นได้ชัดว่ามีหลาย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

4

ฉันได้พบว่าpage-break-inside: avoidจะไม่ทำงานถ้าใด ๆ ของตารางองค์ประกอบที่ผู้ปกครองมีหรือdisplay: inline-block ตรวจสอบให้แน่ใจทุกองค์ประกอบของผู้ปกครองที่มีflexdisplay: block

ยังพิจารณาเอาชนะtable, tr, td's displayรูปแบบด้วย CSS gridสำหรับรูปแบบการพิมพ์ถ้าคุณเก็บประเด็นที่มีกับตาราง


4

โซลูชันปี 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คลาสของ Bootstrap ซึ่งถูกใช้โดยไม่ได้ตั้งใจ<table>องค์ประกอบ

ดังนั้นหากคุณมีปัญหาเดียวกันให้ลองลบออกtable-responsiveจาก<table>ชั้นเรียนเมื่อโทรไปที่ wkhtmltopdf

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.