【问题标题】:WKHTMLTOPDF: How to disable header on the first pageWKHTMLTOPDF:如何在第一页禁用页眉
【发布时间】:2012-08-14 08:04:18
【问题描述】:

wkhtml 不会像应有的那样在每个页面上重复表格元素“th”。所以我认为可以简单地使用 --header-html 选项并以这种方式手动添加表头。但我不希望它们出现在第一页,因为已经有表头,加上其他一些第一页的东西......我找到了一些 JS 解决方案,但它对我来说太复杂了,因为我只知道最基本的JS...有什么想法吗?

【问题讨论】:

  • 有点不清楚你的意思。不会在每一页上重复表格元素吗?您是指页眉中的表格元素吗?您的意思是它应该向源文档中的每个表添加 元素吗?表头和页眉是两种不同的野兽,当手册谈到页眉时,它意味着放入生成的 PDF 文档的每一页的内容:)
  • 我的意思是:表格标题不会在每一页上重复。出于这个原因,我想显示由 wkhtml 生成的页面标题(其中将包含“表标题”)。它们显示正确,但我不希望它们出现在第一页。
  • 如果你也有答案,我需要为 python 做这个,谢谢!

标签: header wkhtmltopdf


【解决方案1】:

你尝试过 JS 解决方案吗?其实没那么复杂。我刚刚对一个长 html 文件进行了测试,该文件包含一个分成许多不同页面的表,我设法使用这个头文件从第 1 页和第 3 页中删除了标题:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <script>
        function subst() {
          var vars={};
          var x=document.location.search.substring(1).split('&');
          for (var i in x) {var z=x[i].split('=',2);vars[z[0]] = unescape(z[1]);}
          var x=['frompage','topage','page','webpage','section','subsection','subsubsection'];
          for (var i in x) {
            var y = document.getElementsByClassName(x[i]);
            for (var j=0; j<y.length; ++j) y[j].textContent = vars[x[i]];

            if(vars['page'] == 1){ // If page is 1, set FakeHeaders display to none
               document.getElementById("FakeHeaders").style.display = 'none';
            }

            if(vars['page'] == 3) { // If page is 3, set FakeHeaders display to none
                document.getElementById("FakeHeaders").style.display = 'none';
            }
          }
        }
        </script>
    </head>
    <body style="border:0;margin:0;" onload="subst()">
        <table style="border-bottom: 1px solid pink; width: 100%; margin-bottom:5px;" id="FakeHeaders">
          <tr>
            <th>Your awesome table column header 1</th>
            <th>Column 2</th>
            <th style="text-align:right">
                Page <span class="page"></span>/<span class="topage"></span>
            </th>
          </tr>
        </table>
    </body>
</html>

他们的关键点不是表“标题”包含在 ID 为“FakeHeaders”的表中。 javascript 函数 subst() 在加载正文时运行,并在函数期间检查当前页面是否为 1 或当前页面是否为 3,如果是,则将 FakeHeaders 设置为不可见。您将需要使用边距和 CSS 以使其看起来像您想要的那样,但这应该可以工作。

这是 wkhtmltopdf 的一个已知问题,很可能不会很快解决,请参阅 issue 566 in the issue tracker。我认为 JavaScript 选项是唯一可用的解决方法,但如果您的输入 html、样式和页面大小/边距非常可预测,您可以尝试使用 div 或手动拆分表格 - 但请注意,这真的很烦人。

【讨论】:

  • 我无法手动拆分它,因为有各种线高......但是:我尝试了这个 JS 解决方案。我得到的和你一模一样,在头元素上。我添加了函数调用和 id,但它什么也没做:/ ...
  • 哦,我看错了...我跳过了您说“头文件”的部分...现在可以正常使用...谢谢! :)
  • 很高兴你的工作,分页可能会导致一些烦人的问题! :)
  • 是的,但这并没有删除添加到第一页的边距,所以它仍然会造成一团糟。
  • @Nenotlep 我们曾经使用 FO,但我们将内容同时用作 HTML 页面和 PDF,并且我们不想构建它两次。不过,这可能是最灵活的解决方案。我们只是决定完全删除页眉。
【解决方案2】:

如果您可以将第一页单独拆分为单独的 html,则可以通过在 WKHTMLTOPDF 中使用“封面”来实现。

PDFKit.new(url, :header_html => header_url, :cover => cover_url).

【讨论】:

  • 现在的问题是封面确实删除了页眉/页脚,但保留了页面中的保留空间。所以结果,假设你需要一个不同的标题或整页背景颜色,你不能用 0.12.5
【解决方案3】:

我遇到了类似的问题,我曾使用过WKHTMLTOPDF 页眉/页脚,我想将它们从封面中删除。问题是页眉/页脚的最大高度仍然出现在包括封面在内的所有页面上。

让我想到并挽救了一天的解决方案是我生成了两个WKHTMLTOPDF 文件,一个在所有页面上都有页眉/页脚,另一个没有任何页眉/页脚。然后我从WKHTMLTOPDF 生成的文件中选择了封面页,没有页眉/页脚,其余页面从其他WKHTMLTOPDF 生成的文件中选择,所有页面上都有页眉/页脚。我使用PHP 中的PDF Merger 库合并两个WKHTMLTOPDF 生成的“PDF”文件的选定页面,以生成单个PDF 文件,其中包含封面页和其余页面的页眉/页脚。

【讨论】:

    【解决方案4】:
    <script type="text/javascript"> 
        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;
    
            if(page != 1) {
                document.getElementById('pHeader').style.display = 'none';
            }
        }
        getPdfInfo();
    </script>
    

    【讨论】:

    • 在你的答案中添加一些 cmets
    【解决方案5】:

    出于某种原因,Nenotlep 的回答对我不起作用。它只删除了页码..

    所以我创建了一个带有显示的类:无;并简单地添加了它。它以这种方式工作。

    function pagination() {
      var vars = {};
      var x = document.location.search.substring(1).split('&');
      for (var i in x) {
        var z = x[i].split('=', 2);
        vars[z[0]] = unescape(z[1]);
      }
      var x = ['frompage', 'topage', 'page', 'webpage', 'section', 'subsection', 'subsubsection'];
      for (var i in x) {
        var y = document.getElementsByClassName(x[i]);
        for (var j = 0; j < y.length; ++j) y[j].textContent = vars[x[i]];
    
        if (vars['page'] == 1) {
          var element = document.getElementById("pager");
          element.classList.add("pager-hidden");
        }
      }
    
    }
    .pager {
      font-size: 0.09375in;
      padding-right: 1.00003in;
      text-align: right;
      letter-spacing: 0.01042in;
      padding-bottom: 0.37501in;
    }
    
    .pager.pager-hidden {
      display: none;
    }
    <body onload="pagination()">
    
      <div class="pager" id="pager">
        <div class="pager-pages">Page <span class="page"></span> / <span class="topage"></span></div>
      </div>
    
    </body>

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签