如何在wkhtmltopdf中使用“--replace”

7

我看了所有这些内容,没有看到关于如何使用"--replace"的内容。所以,接下来是关于如何在wkhtmltopdf中使用"--replace"的方法。

请给我一个示例,谢谢:)


1
你最终解决了这个问题吗?如果是的话,你应该发布答案。 - Jeff Walters
3个回答

3
假设您有一个名为my_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;
              }
          }

          ['username'/*, 'topage', 'page',.. etc and any variable you would want to replace */]
              .forEach(function(param) {
                  substitute(param);
              });
      }
  </script>
  </head>
  <body onload="substitutePdfVariables()">
    <span class="username"></span>
  </body>
</html>

您可以将“username”替换为某个值:

wkhtmltopdf my_super_html.html --footer-html my_footer.html --replace "username" "Veaer"

请注意,我使用JavaScript将命名变量替换为我的值。

在JavaScript中,是否可以将键和值定义为关联数组,而不是作为“wkhtmltopdf”的参数?我在Markdown文档中使用变量。使用pandoc将其从.md转换为.html,并在pandoc调用中包含js作为头文件,这样就可以正常工作。但是,使用这些变量将HTML转换为PDF时,变量不再被转换,它们仍然保持为键。 - Timo
@Timo 很抱歉,我不确定那是否可能。 - viniciux

1
来自@dpineda和@viniciux的混合解决方案。此解决方案不会破坏样式表。
<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
        <script charset="utf-8"> 
            // For WKHTMLTOPDF Substitutions
            window.onload = function()
            {
                function substitute(key, value)
                {
                    var elements = document.getElementsByClassName(key);
                    for (var i = 0; elements && i < elements.length; i++)
                    {
                        elements[i].textContent = value;
                    }
                }

                var url = window.location.href.replace(/#$/, ""); // Remove last # if exist
                // default params
                //['page', 'section','sitepage','title','subsection','frompage','subsubsection','isodate','topage','doctitle','sitepages','webpage','time','date'];
                var params = (url.split("?")[1] || "").split("&");
                for (var i = 0; i < params.length; i++)
                {
                    var param = params[i].split("=");
                    var key = param[0];
                    var value = param[1] || '';
                    var regex = new RegExp('{' + key + '}', 'g');
                    substitute(key, value);
                }
            }
        </script>
  </head>
  <body onload="substitutePdfVariables()">
    <span class="username"></span>
  </body>
</html>

1
我对@viniciux的答案进行了一些调整,实际上已经起作用,在footer.html中进行了改进。
<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <script charset="utf-8"> 
    function replaceParams() {
      var url = window.location.href        
        .replace(/#$/, ""); // Remove last # if exist
      // default params
      //['page', 'section','sitepage','title','subsection','frompage','subsubsection','isodate','topage','doctitle','sitepages','webpage','time','date'];
      var params = (url.split("?")[1] || "").split("&");
      for (var i = 0; i < params.length; i++) {
          var param = params[i].split("=");
          var key = param[0];
          var value = param[1] || '';
          var regex = new RegExp('{' + key + '}', 'g');
          document.body.innerText = document.body.innerText.replace(regex, value);
      }      
    }
  </script>
  </head>
  <body onload="replaceParams()">
    name: {username}
    age: {age}
    url: {url}
    page {page}
  </body>
</html>

然后您可以添加多个参数以动态替换

wkhtmltopdf page.html --footer-html footer.html --replace "username" "Veaer" --replace "age" "20" --replace "url" "google.com"

请注意,页面将是当前的PDF页面,并默认包含在参数列表中。

这个解决方案为我清除了样式表。 - Sebastien247

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接