How to do page numbering in header/footer htmls with wkhtmltopdf?

后端 未结 7 804
粉色の甜心
粉色の甜心 2020-12-07 12:37

I\'m developing an electronic invoicing system, and one of our features is generating PDFs of the invoices, and mailing them. We have multiple templates for invoices, and wi

相关标签:
7条回答
  • 2020-12-07 13:01

    The way it SHOULD be done (that is, if wkhtmltopdf supported it) would be using proper CSS Paged Media: http://www.w3.org/TR/css3-gcpm/

    I'm looking into what it will take now.

    0 讨论(0)
  • 2020-12-07 13:04

    Safe approach, even if you are using XHTML (for example, with thymeleaf). The only difference with other's solution is the use of // tags.

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8"/>
        <script>
            /*<![CDATA[*/
            function subst() {
                var vars = {};
                var query_strings_from_url = document.location.search.substring(1).split('&');
                for (var query_string in query_strings_from_url) {
                    if (query_strings_from_url.hasOwnProperty(query_string)) {
                        var temp_var = query_strings_from_url[query_string].split('=', 2);
                        vars[temp_var[0]] = decodeURI(temp_var[1]);
                    }
                }
                var css_selector_classes = ['page', 'topage'];
                for (var css_class in css_selector_classes) {
                    if (css_selector_classes.hasOwnProperty(css_class)) {
                        var element = document.getElementsByClassName(css_selector_classes[css_class]);
                        for (var j = 0; j < element.length; ++j) {
                            element[j].textContent = vars[css_selector_classes[css_class]];
                        }
                    }
                }
            }
            /*]]>*/
        </script>
    </head>
    <body onload="subst()">
        <div class="page-counter">Page <span class="page"></span> of <span class="topage"></span></div>
    </body>
    

    Last note: if using thymeleaf, replace <script> with <script th:inline="javascript">.

    0 讨论(0)
  • 2020-12-07 13:04

    My example shows how to hide some text on a particular page, for this case it shows the text from page 2 onwards

    <span id='pageNumber'>{#pageNum}</span>
    <span id='pageNumber2' style="float:right; font-size: 10pt; font-family: 'Myriad ProM', MyriadPro;"><strong>${siniestro.numeroReclamo}</strong></span>
    <script>
        var elem = document.getElementById('pageNumber');
        document.getElementById("pageNumber").style.display = "none";
           if (parseInt(elem.innerHTML) <= 1) {
               elem.style.display = 'none';
               document.getElementById("pageNumber2").style.display = "none";
           }
    </script>
    
    0 讨论(0)
  • 2020-12-07 13:06

    Actually it's much simpler than with the code snippet. You can add the following argument on the command line: --footer-center [page]/[topage].

    Like richard mentioned, further variables are in the Footers and Headers section of the documentation.

    0 讨论(0)
  • 2020-12-07 13:11

    Among a few other parameters, the page number and total page number are passed to the footer HTML as query params, as outlined in the official docs:

    ... the [page number] arguments are sent to the header/footer html documents in GET fashion.

    Source: http://wkhtmltopdf.org/usage/wkhtmltopdf.txt

    So the solution is to retrieve these parameters using a bit of JS and rendering them into the HTML template. Here is a complete working example of a footer HTML:

    <!doctype html>
    <html>
    <head>
        <meta charset="utf-8">
        <script>
            function substitutePdfVariables() {
    
                function getParameterByName(name) {
                    var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
                    return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
                }
    
                function substitute(name) {
                    var value = getParameterByName(name);
                    var elements = document.getElementsByClassName(name);
    
                    for (var i = 0; elements && i < elements.length; i++) {
                        elements[i].textContent = value;
                    }
                }
    
                ['frompage', 'topage', 'page', 'webpage', 'section', 'subsection', 'subsubsection']
                    .forEach(function(param) {
                        substitute(param);
                    });
            }
        </script>
    </head>
    <body onload="substitutePdfVariables()">
        <p>Page <span class="page"></span> of <span class="topage"></span></p>
    </body>
    </html>
    

    substitutePdfVariables() is called in body onload. We then get each supported variable from the query string and replace the content in all elements with a matching class name.

    0 讨论(0)
  • 2020-12-07 13:17

    To show the page number and total pages you can use this javascript snippet in your footer or header code:

      var pdfInfo = {};
      var x = document.location.search.substring(1).split('&');
      for (var i in x) { var z = x[i].split('=',2); pdfInfo[z[0]] = unescape(z[1]); }
      function getPdfInfo() {
        var page = pdfInfo.page || 1;
        var pageCount = pdfInfo.topage || 1;
        document.getElementById('pdfkit_page_current').textContent = page;
        document.getElementById('pdfkit_page_count').textContent = pageCount;
      }
    

    And call getPdfInfo with page onload

    Of course pdfkit_page_current and pdfkit_page_count will be the two elements that show the numbers.

    Snippet taken from here

    0 讨论(0)
提交回复
热议问题