2014-12-19 4 views
6

muszę dodawać gradienty tła niektórych td i th elementów strony, która zostanie przekonwertowany do formatu PDF, jednak Dostaję jakieś bardzo dziwne zachowanie z wkhtmltopdf, więc kiedy to zrobić:W jaki sposób można uzyskać wkhtmltopdf wyświetlanie gradientów tła th i td?

table { 
 
    width: 100%; 
 
    border-collapse: collapse; 
 
} 
 

 
th { 
 
    height: 60px; 
 
    border: 1px solid Black; 
 
} 
 

 
td { 
 
    height: 100px; 
 
    background: -webkit-linear-gradient(top, #ccc 0%, #888 100%); 
 
    border: 1px solid Black; 
 
}
<table> 
 
    <tr> 
 
    <th></th> 
 
    </tr> 
 
    <tr> 
 
    <td></td> 
 
    </tr> 
 
    <tr> 
 
    <td></td> 
 
    </tr> 
 
</table>

Wysokość th wydaje się jakoś naruszać na każdym kolejnym td. Wszystko jest w porządku, jeśli usuwam th lub ustawię jego wysokość na całą wielokrotność wysokości td.

Ktoś ma jakiś wgląd w to, co się tutaj dzieje? Mój HTML jest trudny do zmiany, więc mam nadzieję, że uda mi się to zrobić przy użyciu samego CSS lub ustawień wkhtmltopdf.

Edit:

zrzuty ekranu przed upływem Bounty:

Oto jak to wygląda w przeglądarce Webkit:

enter image description here

Oto co wkhtmltopdf robi do niego:

enter image description here

I jeszcze jedna uwaga: nie musi to być th, aby spowodować problem, ponieważ zmiana go na podobnie ukierunkowane <td class='th'> spowoduje ten sam efekt.

+0

Nie sądzę, że to zadziała niestety. Jednak nadal można zrobić rozwiązanie tylko prawie CSS, używając obrazu jako tła. czy to byłoby dla Ciebie ok? – Nenotlep

+0

Rozwiązanie CSS z obrazem byłoby dla mnie wystarczająco dobre, jednak podobne podejście do glitchy jest obserwowane również w tym podejściu. – stovroz

+0

Obie te czynności są dla mnie takie same: 'background: -kres gradientu (liniowy, lewy górny, prawy dolny, kolor-stop (0%, rgba (25, 25, 175, 1)), kolor-stop (33%, rgba (25, 25, 175, 1)), zatrzymanie koloru (100%, rgba (93, 168, 226, 1)); ' i' tło: -wejście -księgowy-gradient (liniowy, lewy górny , prawy dolny, od (rgba (25, 25, 175, 1)), do (rgba (93, 168, 226, 1))); ' – rainabba

Odpowiedz

-1

Użyj wbudowanego css dla tej strony, która konwertuje do formatu pdf.

+0

CSS jest już wstawiany. – stovroz

+0

Widziałem tę radę dla innych problemów WKHtmltoPdf i myślę, że to może być nieaktualne, ponieważ nie działało w żadnym z przypadków, których próbowałem (nagłówki/stopki też). Używam wersji 12.1 lub nowszej. – rainabba

0

Co o tym sądzisz?

<style> 
    .table { 
     width: 100%; 
     display:table; 
     border-collapse: collapse; 
    } 

    .tr { 
     height: 60px; 
     display:table-row; 
    border: 1px solid Black; 
    } 

    .td, .th{ 
     height: 60px; 
     border: 1px solid Black; 
     display:table-cell; 
     background: -webkit-linear-gradient(top, #ccc 0%, #888 100%); 
    } 
</style> 
    <div class="table"> 
     <div class="tr"> 
      <div class="th"></div> 
     </div> 
     <div class="tr"> 
      <div class="td"></div> 
     </div> 
     <div class="tr"> 
      <div class="td"></div> 
     </div> 
    </div> 

Lepiej używać DIV zamiast tabel. Możesz zrobić to samo z małymi zmianami. I lepiej jest dodać CSS do HTML, jeśli pracujesz w formacie PDF lub wysyłasz pocztą e-mail, na przykład szablon.

UPDATE:

Można to zrobić:

<style> 
    table { 
    width: 100%; 
    border-collapse: collapse; 
} 

th { 
    height: 60px; 
} 
td{height: 100px;} 
td, th { 
    background: -webkit-linear-gradient(top, #ccc 0%, #888 100%); 
    border: 1px solid Black; 
} 
</style> 


<table> 
    <tr> 
    <th></th> 
    </tr> 
    <tr> 
    <td></td> 
    </tr> 
    <tr> 
    <td></td> 
    </tr> 
</table> 

lub jQuery zastąpić tabele z zagnieżdżonych div:

<style> 
    .table { 
     width: 100%; 
     display:table; 
     border-collapse: collapse; 
    } 
    .table .tr{ 
     display:table-row; 
    } 

    .table .th{ 
     height: 60px; 
     font-weight:bold; 
    } 
    .table .td{height: 100px;} 
    .table .th, 
    .table .td { 
     border: 1px solid Black; 
     display:table-cell; 
     background: -webkit-linear-gradient(top, #ccc 0%, #888 100%); 
    } 
</style> 


<table> 
    <tr> 
    <th>a</th> 
    </tr> 
    <tr> 
    <td>b</td> 
    </tr> 
    <tr> 
    <td>c</td> 
    </tr> 
</table> 

<script> 
    $(document).ready(function(){ 
     $("table").each(function(a,table){ 
      var i=a; 
      $(table).after('<div class="table" id="table-'+i+'"></div>'); 

      var currentTH = $(this).parent().find('th'); 
      $(currentTH).each(function(){ 
       var content=$(this).html(); 
       $('#table-'+i).append(' <div class="tr"><div class="th">'+content+'</div></div>'); 
      }); 

      var currentTD = $(this).parent().find('td'); 
      $(currentTD).each(function(){ 
       var content=$(this).html(); 
       $('#table-'+i).append(' <div class="tr"><div class="td">'+content+'</div></div>'); 
      }); 

      $(this).remove(); 
     }); 
    }); 
</script> 
+0

Dzięki za sugestię, ale konwersja moich wszystkich tabel (w rzeczywistości nie są to puste tabele pojedynczych kolumn) do zagnieżdżonych elementów div, nie jest tak naprawdę dobrym rozwiązaniem w moim przypadku. – stovroz

+0

OK Aktualizuję odpowiedź, spójrz na to rozwiązanie. ostatnie rozwiązanie jQuery zamienia twój stół na przygnębiony div. Możesz zaktualizować to rozwiązanie do jquery, aby zapisać niektóre atrybuty i wstawić je do nowych elementów div. –

3

wkhtmltopdf nadal używa starej (przestarzałe) WebKit gradientu składnia.Spróbuj tego:

-webkit-gradient(linear, left top, left bottom, from(#ccc), to(#888)); 
+2

Brak zmian w wyniku z tą składnią obawiam się. – stovroz

0

Musieliśmy uaktualnić wkhtmltopdf ze względów bezpieczeństwa i doświadczyliśmy tego samego problemu, jednak po zmaga się z CSS udało mi się znaleźć rozwiązanie, które pracowały dla nas, na przykład, następujące CSS:

.TableRecords_Header { 
 
     color:#EAEAEA; 
 
     font-weight: normal; 
 
    background: #0F5D85 url(/RichWidgets/img/bar_gradient.png); 
 
     white-space: nowrap; 
 
     line-height: 18px; 
 
     padding: 4px 6px 4px 6px; 
 
     border-right: 1px solid white; 
 
     font-size: 14px; 
 
}

stosowane do każdego stołu <th> lub <tr> komórki, czyni coś takiego: Gradient Bug

Okazuje się, że ta wersja WebKit ma problemy z obsługą "repeat-x" właściwości CSS, tak, aby rozwiązać ten problem Użyłem tej CSS3 równoważne:

.TableRecords_Header { 
 
    background-repeat: no-repeat !important; 
 
    background-size: 100% 23px !important; 
 
}

Gdzie background-repeat: no-repeat! Important; important; mówi webkitowi, aby nie używał powtarzania tła, eliminując problem. Jako tło dla wielkości, wartość 100% robi to samo jak oryginalny repeat-x, a 23px jest wysokość obrazu, który produkuje swoje gradient. w tym przypadku jest to wysokość /RichWidgets/img/bar_gradient.png. Gdy dodaliśmy ten styl CSS3 PDF renderowane poprawnie jak pokazano na poniższym obrazie:

Gradient problem solved

poważaniem, Nuno Guedes

1

Dla mnie było to tak proste, jak dodanie

background-repeat: no-repeat !important;