【问题标题】:css: rendering page numbers in HTML footer for printed PDF page (Chromium)css:在 HTML 页脚中为打印的 PDF 页面呈现页码(Chromium)
【发布时间】:2018-01-10 14:43:47
【问题描述】:

我动态生成 PDF 的工作流程:

  1. Handlebars 编译 HTML
  2. 我使用带有 position: fixed 的 CSS 技巧在该 HTML 中添加了一个“假页脚”,该技巧实际上只出现在 HTML 中一次的普通 <div> 元素上
  3. Puppeteer(因此,无头 Chromium 浏览器)用于从此 HTML 页面生成 PDF(我知道 Puppeteer 的 git 版本具有自动页脚插入功能;由于复杂的原因,我坚持使用不支持此功能的 npm 版本)。

我的问题是如何在此页脚中添加页码。我尝试了counter-reset + counter-increment 解决方案,但这不会增加页面计数器,因为从它的角度来看,只有一个 HTML 元素应用了它。

所以我在生成的 PDF 的每一页上都有一个页脚,上面写着“第 1 页”。

HTML 元素:

...
<div class="page-footer"></div>
...

CSS 样式:

.report {
  counter-reset: pageIndex 0;

  .page-footer:before {
    content: "Page: " counter(pageIndex);
    counter-increment: pageIndex +1;
  }

  .page-footer {
     position: fixed;
     left: 0;
     bottom: 0;
     width: 100%;
     border-bottom: solid 1px;
  }
  ...
}

这样的事情真的适用于 Chromium,还是我只是在浪费时间?

【问题讨论】:

    标签: javascript css pdf-generation chromium puppeteer


    【解决方案1】:

    我不熟悉你的工具,但我自己做了一些 HTML 到 PDF 的东西。 听起来您的单个 HTML 正在使用页脚中的页码呈现(正确,因为此时只有一页),并且正在通过“打印到文档”类型转换创建单独的 PDF 页面。

    然后我的建议是将您现有的 CSS 规则弹出到 @media print 查询中,这应该对 PDF 打印过程创建的页面进行编号。

    【讨论】:

    • 是的,它是一个将 HTML 呈现为 PDF 的无头浏览器。我不确定在我的情况下是否考虑了 [at]media(我实际上正在编辑一个 *.scss 文件,然后通过 Sass 编译为 *.css):在我的样式中添加了这个,只是为了测试目的:[at]media print { body { background-color: #ff0000; } },但我没有看到任何变化(我使用了正确的 'at' 登录代码,但不能在评论中使用它)。
    • 但也许有些东西会覆盖样式,我必须仔细检查(生成的 css 中有 6000 多行......)。感谢您的建议!
    • 我已经环顾四周了...尝试在您的媒体查询中添加@page:after 规则并在其中弹出页码。不确定它是否有效(这有点小技巧,:after 用于生成页边距!),但值得一试吗?
    • @Cristina,刚刚想到可以为您节省大量狩猎时间。尝试将.page-footer{} 规则按原样弹出到@media print 查询中。页面没有覆盖规则(它是一个自定义元素),因此它不执行额外的样式设置,它直接从只有一个“页面”的screen 渲染(您的默认 CSS)中获取内容 - 因此每个 PDF“页面”上的“第 1 页”(对于屏幕来说是正确的)。
    • 非常感谢,我会试试这个!
    猜你喜欢
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2019-03-22
    相关资源
    最近更新 更多