Wkhtmltopdf के लिए तालिका पंक्ति के अंदर पृष्ठ विराम से कैसे बचें


81

मैं एक पृष्ठ के साथ html पृष्ठ से पीडीएफ रिपोर्ट उत्पन्न कर रहा हूं ।

मैं इस उद्देश्य के लिए wkhtmltopdf का उपयोग कर रहा हूं ।

जब pdf उत्पन्न होता है तो वह tr टैग में कहीं भी टूट जाता है

मैं इससे बचना चाहता हूं।

जवाबों:


152

अद्यतन 17.09.2015: आपके द्वारा उपयोग किए जा रहे संस्करण की जाँच करें: wkhtmltopdf 0.12.2.4 समस्या को ठीक करने के लिए कहा गया है (मैंने जाँच नहीं की है)


यह wkhtmltopdf में एक ज्ञात मुद्दा है। वेबकिट (WKhtmltopdf में WK) द्वारा उपयोग किया जाने वाला पेज ब्रेकिंग एल्गोरिथ्म वास्तव में बड़ी तालिकाओं के लिए अच्छा काम नहीं करता है। मेरा सुझाव है कि टेबल को छोटे-छोटे टुकड़ों में तोड़ना, जो आसानी से पृष्ठों में विभाजित हो जाते हैं और सीएसएस का उपयोग करते हैं:

table, tr, td, th, tbody, thead, tfoot {
    page-break-inside: avoid !important;
}

निम्नलिखित wkhtmltopdf मुद्दों पर भी एक नज़र है, उनके पास दिलचस्प टिप्पणियां हैं जो उदाहरण के लिए तालिका विभाजन की समस्या पर चर्चा करती हैं। एक JS समाधान है जो प्रोग्राम को 168 में टेबल को विभाजित करता है जो आपकी मदद कर सकता है (हालांकि मैं इसका उपयोग नहीं करता हूं)।

अद्यतन ०.११.२०१३ ऊपर दिए गए १६.2013 अंक में इस बारे में बहुत चर्चा है। किसी ने wttmltopdf के एक संस्करण को संकलित करने में कामयाबी हासिल की है जो बेहतर टेबल ब्रेकिंग का समर्थन करता है, लेकिन दुर्भाग्य से ऐसा लगता है कि यह आधिकारिक तौर पर जारी नहीं हुआ है और इसमें अन्य बग शामिल हो सकते हैं। मुझे नहीं पता कि इसे कैसे प्राप्त किया जाए और मुझे नहीं पता कि विंडोज पर कैसे संकलित किया जाए, लेकिन कोई भी व्यक्ति यहां उदाहरण के लिए टिप्पणी की जांच कर सकता है (नीचे नया अपडेट देखें)।

अपडेट 24.02.2014 आपको यह सुनकर प्रसन्नता होगी कि wttmltopdf 0.12 में अन्य लोगों के बीच इस सुविधा में बहुत सुधार किया गया है। हालाँकि, 0.12.1 की प्रतीक्षा करें और किसी भी नए संस्करण का उपयोग शुरू करने से पहले अच्छी तरह से परीक्षण करें, यह अभी भी थोड़ा अस्थिर है, हालांकि एंटीअलिज़ के साथ काम करने वाले नए लोग एक महान काम कर रहे हैं (एस्कुलज़ चट्टानों)! Wkhtmltopdf.org और github पर अपडेट रखें । Google कोड साइट अप्रचलित है और धीरे-धीरे माइग्रेट की जा रही है।


1
सूचना के लिए धन्यवाद। संस्करण 0.12.1 पृष्ठ विराम समस्या हल करता है।
निधि सर्वैया

1
ध्यान दें, यह समाधान केवल हाल के 0.12.1 संस्करण के साथ काम करता है। कुछ भी पहले काम नहीं करता है।
सेरिन

4
मैंने कुछ दिनों तक इससे संघर्ष किया। मेरी तालिका एक शैली के साथ एक div में थी बाहर कर दिया display: inline-block। इसे बदल दिया blockऔर इसके ऊपर के बदलावों के साथ सभी ने काम करना शुरू कर दिया!
ह्यूज

2
@Nenotlep आपके उत्तर के लिए धन्यवाद। हां, मैंने पहले से ही इस बारे में एक नया प्रश्न पोस्ट किया है: stackoverflow.com/q/36334330/3391783 - यह हास्यास्पद है कि यह सब 0.12.1-ish या 0.12.2-ish संस्करणों में वापस काम करना कैसा लग रहा था और 0.12 में फिर से टूट गया है। 3-ईश संस्करण।
लो_क्रेंट्स

2
@DjDacSaunders WKHTMLTOPDF एक हैक है, न कि शुद्ध html -> pdf टूल। इसका उद्देश्य एक बहुत लंबे दस्तावेज़ को एक पृष्ठांकित प्रारूप में प्रस्तुत करना है। तथ्य यह है कि इस पर हमारा कोई नियंत्रण नहीं है। यदि आप चाहते हैं कि यह संपर्क करने के लिए सबसे अच्छी जगह में सुधार हो तो wttml का अपस्ट्रीम है, जो या तो क्यूटी प्रोजेक्ट है या शायद वेबकिट प्रोजेक्ट। मैं इस बात को हमेशा के लिए बदल देता हूं क्योंकि यह वास्तव में वैबसाइट नहीं है जब वेब पेजों को पीडीएफ फाइलों के रूप में प्रस्तुत करना था: / पूर्ण नियंत्रण के लिए, शायद प्रिंसएक्सएमएल की कोशिश करें। (x) HTML एक प्रिंट फॉर्मेट नहीं है और उस प्रोब के "समाधान" हमेशा हैक होते हैं।
जोएल पेल्टनन ऑक्ट

18

यह पुरानी पोस्ट है, लेकिन जब से मैं बहुत समय बर्बाद कर रहा हूं उचित समाधान खोजने की कोशिश कर रहा हूं, मैं इसे यहां डालूंगा, शायद यह किसी के लिए उपयोगी होगा।

इसलिए मैंने जो पढ़ा, उससे समस्या

page-break-inside: avoid

यह है कि यह काम नहीं करता है लेकिन वास्तव में यदि आप इसे उस तत्व पर सेट करते हैं जिसमें display:blockयह अपेक्षित है (जैसा कि एसओ में कहीं उल्लेख किया गया है)। इसलिए टेबल सीएसएस की सरल संरचना के लिए

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

और तालिका संरचना

<table>
....
<tr>
    <td><div>some text</div></td>
    <td><div>more text</div></td>
</tr>
....
</table>

उम्मीद के मुताबिक काम करेंगे।

मेरे पास उपद्रवियों के साथ थोड़ा अधिक जटिल मामला था, इसलिए ऊपर से समाधान इसे मोरों के लिए तोड़ रहा था, जो वांछित प्रभाव नहीं था। मैंने इसे प्रत्येक पंक्तिबद्ध पंक्ति के लिए divs का उपयोग करके हल किया। मेरा jquery js सभी काम कर रहा है:

$(window).load(function () {
    var sizes = {};
    $('#the_table tr:first th').each(function (a, td) {         
        var w = $(td).width();
        if (sizes.hasOwnProperty('' + a)) {
            if (sizes['' + a] < w)
                sizes['' + a] = w;
        }
        else {
            sizes['' + a] = w;
        }
    });

    var tableClone = $('#the_table').clone();
    $('#the_table').replaceWith('<div class="container"></div>');

    var curentDivTable;
    var cDiv = $('.container');
    tableClone.find('tr').each(function (i, ln) {
        var line = $(ln);
        if (line.hasClass('main_row')) {
            var div = $('<div class="new-section"><table><tbody>')
            currentDivTable = div.find('tbody');
            cDiv.append(div);               
        }
        currentDivTable.append(line);
    });
    //optional - maybe in % its better than px
    var sum = 0;
    $.each(sizes, function (a, b) {
        sum += b;
    });
    var widths = {};
    $.each(sizes, function (a, b) {
        var p = Math.ceil(b * 100 / sum);
        widths['' + a] = p + '%';
    });
    //setup
    $('.container table').each(function (a, tbl) {
        $(tbl).find('tr:first td, tr:first th').each(function (b, td) {
            $(td).width(widths['' + b]);
        });
        $(tbl).addClass('fixed');
    });
});

सीएसएस:

div.new-section {
    page-break-inside: avoid;
}
.container, .new-section, .new-section table.fixed{
    width: 100%;
}

.new-section table.fixed{
    table-layout:fixed;
}

मुझे नहीं पता कि क्या सब कुछ चाहिए और मुझे नहीं लगता कि यह सही है, लेकिन यह काम करता है। क्रोम पर ही परीक्षण किया गया


16

0.12 के बाद से यह समस्या हल हो गई है, लेकिन कभी-कभी, जब पृष्ठ में फिट होने के लिए कोई तालिका बहुत लंबी होती है, तो wkhtmltopdf इसे दो भागों में तोड़ता है और नए पृष्ठ पर कॉलम हेडर को दोहराता है और ये कॉलम हेडर पहली पंक्ति में सुपरपोज्ड दिखाई देते हैं।

मैं wkhtmltopdf github मुद्दों अनुभाग पर इस समस्या का एक अस्थायी समाधान पाया: https://github.com/wkhtmltopdf/wkhtmltopdf/issues/2531

इस लाइन को अपने दृश्य सीएसएस में जोड़ें:

tr {
  page-break-inside: avoid; 
}

यह वास्तव में मदद करता है। धन्यवाद!! निश्चित नहीं कि यह डिफ़ॉल्ट व्यवहार क्यों नहीं है।
जोसेफ

6

मैं दिनों के लिए इस समस्या में खोद रहा हूँ, और आखिरकार सही समाधान पाया। आप इस प्रोजेक्ट को phpwkhtmltopdf का संदर्भ दे सकते हैं । निर्देशिका में देखें articleऔर आपको 3 समस्याओं के लिए 3 समाधान मिलेंगे। संक्षेप में, अंतिम समाधान सीएसएस शैली जोड़ रहा है

thead {
    display: table-row-group;
}
tr {
    page-break-before: always;
    page-break-after: always;
    page-break-inside: avoid;
}
table {
    word-wrap: break-word;
}
table td {
    word-break: break-all;
}

आप कर रहे हैं चीनी, इस साइट की जांच करने के लिए स्वतंत्र महसूस अगर关于wkhtmltopdf,你一定想知道这些 आप चाहें तो सार की जाँच करें wkhtmltopdf के लिए सार


इसने मेरे लिए काम किया। मैं wkhtmltopdf 0.12.4 का उपयोग कर रहा हूं । धन्यवाद!
ह्यूगो


5

किसी कारण के लिए मेरे विशेष मामले में पिछले उत्तरों में से किसी ने भी मेरे लिए काम नहीं किया। जो काम खत्म हुआ, वह वास्तव में कई चीजों का मेल था।

  1. मैंने (Ubuntu 16.04 में) Wkhtmltopdf python आवरण को pipkit का उपयोग करके pdfkit नामक स्थापित किया , और फिर apt-get के माध्यम से Wkhtmltopdf को स्थापित करने के बजाय मैंने नीचे दी गई स्क्रिप्ट का अनुसरण करते हुए स्थैतिक बाइनरी (संस्करण 0.12.3) स्थापित किया

    #!/bin/sh
    
    sudo apt-get install -y openssl build-essential xorg libssl-dev
    wget http://download.gna.org/wkhtmltopdf/0.12/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
    tar -xJf wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
    cd wkhtmltox
    sudo chown root:root bin/wkhtmltopdf
    sudo cp -r * /usr/
    
  2. इस सीएसएस को जोड़ा (जैसा कि यहां दिए गए उत्तर में सुझाया गया है):

    tr, td div, th div{
        page-break-inside: avoid;
    }
    
  3. और फिर यहां दिए गए टैग और टैग भी लगाएं (इनके बिना भी मेज बदसूरत तरीके से टूट जाएगी):<thead><tbody>

    <table>
        <thead>
            <tr>
                <th>Column 1</th>
                <th>Column 2</th>
            </tr>
        </thead>
    
        <tbody>
            <tr>
                <td>Value 1</td>
                <td>Value 2</td>
            </tr>
        </tbody>
    </table>
    

इन संशोधनों के साथ मैं अब HTML को जेनरेट करने के लिए माको टेम्प्लेट का सफलतापूर्वक उपयोग कर सकता हूं और फिर उस Wkhtmltopdf को फ़ीड कर सकता हूं और एक सुंदर रूप से पृष्ठांकित पीडीएफ प्राप्त कर सकता हूं।


4

मैंने अपनी तालिकाओं में सभी प्रकार के हेरफेर करने की कोशिश की, लेकिन मैंने जो कुछ भी कोशिश की, वह पृष्ठ विराम को एक पंक्ति के बीच में नहीं रोक सका। हताशा में मैंने विभिन्न संस्करणों की कोशिश की, और निम्नलिखित पाया:

वाक्थमलटॉपडाउन 0.12.2.1: खराब

वाक्थमलटॉपडाउन 0.12.3: खराब

वाक्थमलटॉप ०.१२.१: अच्छा

मेरा समाधान 0.12.1 संस्करण में डाउनग्रेड करना था, जिसने मेरे मुद्दों को हल किया। दी, वे शायद आंशिक रूप से मेरे HTML के बारे में सुपर ओसीडी नहीं होने के कारण हैं, लेकिन जैसा कि HTML TinyMCE (उपयोगकर्ताओं द्वारा) के अंदर उत्पन्न होता है, मेरे पास वास्तव में ज्यादा विकल्प नहीं हैं।

इसके अलावा, नेस्टेड टेबल मेरे लिए किसी भी संस्करण में काम नहीं करते हैं।


मेरे लिए 0.12.1 समस्या का समाधान नहीं करता है, और यह दूर ले जाता है
यूनिक्सगैन

2

एक ट्रे को तोड़ने के बिना पीडीएफ के अंदर पेज ब्रेक का उपयोग कैसे करें?

यहाँ समाधान है कि आप किसी भी HTML फ़ाइल में उपयोग कर सकते हैं .....

अपनी ट्रे शुरू करने के बाद आपको ट्रे के अंदर एक div लेना है और div को यह css देना है:

<tr>
      <div style="page-break-inside:avoid !important; page-break-after:auto !important; overflow: hidden; display:block !important; width:100% ">
     </tr>

2

मैं एक ही मुद्दे को कई परीक्षण n त्रुटियों के बाद जोड़ रहा था इस सीएसएस ने इस मुद्दे को हल किया

tr {
    display: inline-table;
}


1

ऊपर दिए गए जवाब मेरे काम नहीं आए। मुझे विशेष रूप से ज़ूम विकल्प को मेरे pdfkit config को निष्क्रिय करना था।

PDFKit.configure do |config|

  config.default_options = {
    print_media_type: false,
    page_size: "A4",
    encoding: "UTF-8",
    ## Make sure the zoom option is not enabled!
    ## zoom: '1.3',
    disable_smart_shrinking: false,
    footer_right: "Page [page] of [toPage]"
  }

end

1

किसी को भी इसके साथ समस्या होने के लिए, एक बात याद रखें कि टेबल को शरीर का सीधा बच्चा होना चाहिए , अन्यथा सीएसएस काम नहीं करेगा (कम से कम मेरे साथ ऐसा ही हुआ)।


यह मेरे लिए मामला नहीं था - मैं भी पुष्टि कर सकता हूँ नेस्टेड टेबल पृष्ठ विराम का सम्मान किया ... मेरे लिए मुद्दा अधिक मैक ओएस बनाम ubuntu था ...
पेट्रोव

मेरे पास एक समान मुद्दा था: मेरी मेज display: table-cell;लागू के साथ एक div के भीतर थी । उन शैलियों को बनाने @media only screenसे पृष्ठ टूट जाता है। यदि आपको पृष्ठ विराम काम नहीं मिल रहा है, तो चरणों में आधा CSS हटाकर विभाजित करने और जीतने की कोशिश करें और देखें कि क्या यह काम करता है।
लेस्ली विलजेन

1

मुझे यह हास्यास्पद समाधान मिला, लेकिन यह मेरे लिए बहुत अच्छा काम कर रहा है :)

मैंने इस तरह से एक बहुत लंबी पंक्तिबद्ध स्तंभ रखा है

<td rowspan="XXX TOTAL ROWS" style="width:0px"></td>

और फिर मेज नहीं टूटेगी।


1

एक और विकल्प: प्रत्येक trको अपने आप में रखें tbodyऔर फिर पे ब्रेक ब्रेक सीएसएस नियमों को लागू करें tbody। टेबल्स मल्टीपल सपोर्ट करते हैंtbody एस का ।

थोड़ा अतिरिक्त मार्कअप, लेकिन मेरे लिए शालीनता से काम करता है।


मैंने ट्र तत्वों के एक समूह पर यह कोशिश की - उन्हें अलग-अलग tbody तत्वों में लपेटना - कुछ समूहों को पंक्तियों को एक साथ रखने का प्रयास करना। इसका कोई असर नहीं हुआ। "पृष्ठ-विराम-अंदर: इस से बचें:" "tr" तत्व के कारण पेज-हेडर्स के ऊपर, फिर से ("डिफ़ॉल्ट" व्यवहार) डेटा प्रिंट करने के लिए एक उलट होता है।
जोसेफ

हाँ, मैं अब एक ही "पृष्ठ-विराम-अंदर: दोनों टोड और ट्र और td पर नियम से बचता हूं:" tbody, tbody> tr, tbody> tr> td, tbody> tr> th {पृष्ठ-ब्रेक-इन-अंदर लागू करें से बचें;} "जो ज्यादातर स्थितियों में काम करता दिखाई देता है।
ट्रॉय मोरहाउस

धन्यवाद, लेकिन बस कोशिश की है कि। यह अभी भी टेबल-पंक्तियों के मेरे tbody समूहों के बीच में पेज-ब्रेक करता है। मैंने टीओबी में एक वर्ग जोड़ने की भी कोशिश की, और कक्षा में 'टाल' के साथ सीएसएस - कोई प्रभाव नहीं। काश मैं जानता था कि यह वास्तव में सीएसएस-नियम के साथ "क्या" कर रहा था - शायद यह सोचने का कोई तरीका है कि trs का एक समूह वास्तव में 'एक पंक्ति' है - लेकिन चूंकि एक tr 2x + लंबा बनाने से भी यह टूट जाता है, मैं अनुमान लगा रहा हूं। नहीं। हो सकता है कि कोई अन्य 10 वर्षों में एक उपयोगी HTML से पीडीएफ समाधान कर देगा, लेकिन मुझे लगता है कि वे इसके बजाय प्रत्यक्ष तंत्रिका डेटा-स्थानांतरण की प्रतीक्षा कर रहे हैं।
जोसेफ

1

मैंने कुछ सुझाए गए समाधानों के संयोजन का उपयोग करके समस्या को हल किया।

मैंने अपनी तालिका को एक div में लपेटा और निम्नलिखित CSS को परिभाषित किया।

.wrapping-div {
        display: block;
        page-break-inside: avoid !important;
    }

.wrapping-div table, .wrapping-div tbody, .wrapping-div tr, .wrapping-div td, .wrapping-div th {
        page-break-inside: avoid !important;
    }

समाप्त होने पर तालिका संरचना निम्न उदाहरण के रूप में परिभाषित की गई थी:

<div class="wrapping-div">
 <table>
  <tbody>
   <tr>
    <th>
      header
    </th>
    <td>
      content
    </td>
   </tr>
  </tbody>
 </table>
</div>

मुझे td या th टैग के अंदर कोई div बनाने की आवश्यकता नहीं थी।

समस्या को हल करने का प्रयास करते समय मैंने जो महत्वपूर्ण बातें देखीं:

  • टेबल में सभी को शामिल किया जाना चाहिए
  • Div में डिस्प्ले: ब्लॉक होना चाहिए
  • जब कोई तालिका किसी पृष्ठ में फिट नहीं होती है, तो यह स्वचालित रूप से पूरी तालिका को अगले पृष्ठ पर ले जाएगी (मैंने इसे बड़ी तालिका के साथ आज़माया नहीं है)
  • यदि आप CSS से केवल ".wrapping-div table" चयनकर्ता को हटाते हैं , तो यह तालिका को दो पृष्ठों में विभाजित करने की अनुमति देगा, लेकिन इसे सही ढंग से प्रस्तुत करेगा, दो पृष्ठों में एक सेल को नहीं तोड़ना (यह वर्ड पर डिफ़ॉल्ट व्यवहार की तरह है) )

आशा है कि ये आपकी मदद करेगा।



1

पेज ब्रेक से बचने के लिए, हम सीएसएस विकल्प से बचने के लिए पेज ब्रेक का उपयोग कर सकते हैं।

tr { page-break-inside: avoid; }

किसी भी सामग्री (छवि / पाठ) को तोड़ें और उसे अगले पृष्ठ में प्रदर्शित करें

.sample-image { page-break-before: always; }

0

क्या आपके पास टेबल हेड है? और एक टेबल बॉडी?

<table>
<tbody>
<tr><th>Name</th><th>Value</th></tr>
<tr><td>url</td><td>stackoverflow.com</td></tr>
<tr><td>ip</td><td>123.123.123.123</td></tr>
</tbody>
</table>

यह एक तालिका का उचित स्वरूपण है, जबकि अधिकांश ब्राउज़र कम देखभाल नहीं कर सकते हैं, आपके द्वारा उल्लेख किए गए जैसे कन्वर्टर्स , यदि आपके लापता <tbody>या <th>टैग मैं आपको पहले जोड़ने का प्रयास करने का सुझाव देता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.