tablonun satırında sayfa sonundan kaçının


99

Html'yi wkhtmltopdf ile PDF'ye dönüştürdüğümde, html'deki tablonun satırında sayfa kırılmasını önlemek istiyorum. Sayfa içi kullanıyorum: tablo işlerinden kaçının, ancak çok fazla satırım var, o zaman çalışmıyor. Tr'nin görüntülenmesini blok veya başka bir şey olarak ayarlarsanız , tablonun biçimlendirmesini değiştirir ve çift kenarlık ekler. Veya tablonun bölündüğü her sayfaya tablo başlığını eklemek mümkündür.


1
Pardon, kullanırken sorun page-break-inside: avoid;nedir?
Christian

2
Ben page-break-içini kullandığınızda @ChristianVarga: tr ile kaçınınız, bu iş yürümez
Ankit Mittal

1
Tablolarla kırılan sayfa oldukça hatalı. Bu JavaScript geçici çözümüne
Jona

2
aslında page-break-inside:avoidtr td gibi tüm tablo öğeleriyle denedim ama işe yaramadı.
Ankit Mittal

3
Yay WebGL için Google, göz kamaştırıcı hızlı javascript, taşınabilir yerel istemci, ancak yine de veri tablolarını yazdıramıyoruz. Bunu kimin yapması gerekir ??? Sadece dünyadaki hemen hemen her işletme. Bu arada, az önce google docs'da bir e-tablo yazdırmaya çalıştım ve sürekli olarak Chrome'umun çökmesine neden oluyor. Sanırım google docs pdf aracılığıyla yazdırıyor. : /
Sam Watkins

Yanıtlar:


76

Bunu CSS ile deneyebilirsiniz:

<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>

Çoğu CSS kuralı <tr>, tam olarak yukarıda belirttiğiniz şey nedeniyle doğrudan etiketlere uygulanmaz - displaybu CSS kurallarına izin vermeyen benzersiz bir stile sahiptirler. Ancak, <td>ve <th>içlerindeki etiketleri genellikle do şartnamenin bu tür izin - ve kolayca ALL için çocuk-tür kural uygulayabilirsiniz <tr>'ler ve <td>yukarıda gösterildiği gibi' ler kullanılarak CSS.


18
Ne yazık ki bu (henüz) webkit tabanlı tarayıcılarda çalışmıyor.
Attila Fulop

2
Evet - bazı tuhaflıklar var. Daha fazla bilgi için @ Peter'ın bu soruya cevabına bakın: stackoverflow.com/questions/7706504/… .
Troy Alford

3
Yalnızca tr / td değil, tüm tabloyu alırsanız çalışır: stackoverflow.com/a/13525758/729324
marcovtwout

1
IE8'de, muhtemelen diğerlerinde bununla ilgili sorunlarla karşılaştım, burada tüm tablonun bir sayfaya sığmaya çalışmasına neden oluyor ve herhangi bir taşmayı kesiyor. Ayrıca, bu tablolar için "sığacak şekilde ölçekle" seçeneğini de yok sayıyor gibiydi.
Tom Pietrosanti

6
@AttilaFulop Hala? Gönderiniz 3 yaşında ve hala çalışamıyorum. Teşekkürler
2016

34

Webkit tarayıcılarında bu sorunu çözmenin en iyi yolu, her td öğesinin içine bir div koymak ve sayfa sonunu uygulamak: div'e stilden kaçının, şunun gibi:

...
<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 sözde 'page-break-inside: escape;' özelliği, bu, PDF oluşturmak için wktohtml kullanıldığında satır içeriğinin bir sayfa sonu ile ikiye bölünmesini engelliyor gibi görünüyor. Tr öğesi, sayfa sonunun biraz üzerinde asılı kalabilir, ancak div ve içindeki herhangi bir şey olmayacaktır.


margin: 4px 0 4px 0;Ben ara sıra bir rekor kaybediyordu, benim için hile yaptı. Teşekkürler
Wartodust

Bu yaklaşımla ilgili bir sorun, bazen bir satırın yalnızca birkaç hücresinin bir sonraki sayfaya bölünmesidir, ancak her hücre kendi başına kırılmaz.
WorldSEnder

@WorldSEnder Evet. Bunun için bir çalışma buldunuz mu?
ranjansaga

4
Çalışmıyor. Hiç birşey çalışmıyor. İnternetteki her "çözümü" denedim ve çözüm yok. Tabloyu bile oluşturamayan boktan yazılımları kabul etmeliyiz.
Niklas R.

18

Yukarıda @AaronHill'in 4px numarasını kullandım ( bağlantı ) ve gerçekten iyi çalıştı! <td>Tablodaki her birine bir sınıf eklemeye gerek kalmadan daha basit bir css kuralı kullandım .

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

10

Bu sorunu çözmek için yeni bir yol buldum, en azından benim için (MacOS Sierra'da Chrome Sürümü 63.0.3239.84 (Resmi Yapı) (64-bit))

Üst tabloya bir CSS kuralı ekleyin:

table{
    border-collapse:collapse;
}

ve td için:

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

Aslında bu çözümü Stack Overflow'da buldum, ancak ilk Google aramalarında görünmedi: CSS, tablo satırının içindeki sayfa sonunu durdurmak için

Problemi çözdüğü için @ Ibrennan208'e şeref!


çözülmüş kesme masası sorunu diğer tasarımını
sıraya diziyor

9

CSS sayfa kırılımını kullanmak işe yaramaz (bu bir webkit tarayıcı sorunudur).

Uzun bir tabloyu belirttiğiniz sayfa boyutuna bağlı olarak otomatik olarak daha küçük tablolara bölen bir wkhtmltopdf JavaScript tablo bölme saldırısı vardır (x satırlık statik bir değerden sonra sayfa kırmak yerine): https://gist.github.com/3683510


Bu js hack, wkhtmltopdf olmadan web sayfasını yazdırmak istersem işe yarar?
120196

Bu benim için çalışan tek kişi. Ayrıca HTML-PDF kitaplığıyla da çalışır.
gilbert-v

8

Aaron Hill'in cevabına göre aşağıdaki JavaScript'i yazdım:

//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" />');
    }
});

Nerede dontSplit Eğer td en sayfalar arasında bölmek istemiyoruz tablonun sınıftır. Bunu aşağıdaki CSS ile kullanın (yine Aaron Hill'e atfedilir):

 .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 */
  }

Bu, Chrome'un en son sürümünde iyi çalışıyor gibi görünüyor.


1
Wkhtmltopdf kullanarak büyük tabloları PDF formatında oluşturuyorum ve bu kabul edilebilir sonuçlar veren tek çözümdür. Daha iyi olabilirdi (Webkit, bir sayfa sonundan sonra hücre sınırlarını tekrarlamaz), ancak en azından içerik oradadır. Teşekkürler!
Jonathan Tepesi

7

Çalışmak için bulduğum tek yol, her bir TR öğesini kendi TBODY öğesine yerleştirmek ve sayfa sonu kurallarını TBODY öğesine css aracılığıyla uygulamaktı.


1
Bu benim için Arch Linux'ta Chromium Sürüm 40.0.2214.111 (64-bit) üzerinde diğerlerinden daha iyi çalışıyor. Bu çirkin ve hacky hissediyor - ama görünüşe birden tbodyelemanları içine geçerlidir table stackoverflow.com/questions/3076708/...
ElDog

Bu benim için çalışmıyor (Chrome 56.0.2924.87 (64-bit), Mac OS 10.12.2).
Nhat Dinh

4

İle deneyin

white-space: nowrap; 

Yeni satırlarda kırılmayı önlemek için stil td.


1
Diğer çözümlerden çok daha basit. Bu yeni bir şey mi?
bendecko

4

page-break-inside: avoidTablonun üst öğelerinden herhangi biri display: inline-blockveya ise bunun işe yaramayacağını buldum flex. Tüm ana öğelerin olduğundan emin olun display: block.

Ayrıca ağır basan düşünün table, tr, td'nin displayCSS ile stil gridbaskı düzeni için sofraya sorunlarınız devam edersek.


4

2020 çözümü

Tüm tarayıcılarda sürekli olarak çalışabileceğim tek şey, her satırı kendi tablo öğesinin içine koymaktır . Bu aynı zamanda düğüm HTML-PDF ile de çalışır. Sonra her şeyi olarak ayarlayın page-break-inside: avoid.

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

Bunun tek dezavantajı, sütunların genişliğini manuel olarak ayarlamanız gerektiğidir, aksi takdirde oldukça garip görünür. Aşağıdakiler iki sütunla benim için iyi çalıştı.

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


Misal

<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>

Örnek bir tablo HTML'si sağlayabilir misiniz? Teşekkürler.
PavanBhushan

@ Gilbert-v örneğiyle yaptığınız düzenleme için teşekkür ederiz. Bunu deneyeceğim.
PavanBhushan

0

Bu eski bir soru ama son zamanlarda aynı hataya girdim. Benim durumumdaki sorun table-responsive, yanlışlıkla <table>eleman üzerinde kullanılan Bootstrap sınıfıyla ilgiliydi .

Aynı sorunu var ise, kaldırmayı deneyin table-responsivegelen <table>wkhtmltopdf çağrılırken sınıfa.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.