打印到PDF时更改默认页眉/页脚

apo*_*fos 19 javascript google-chrome google-chrome-headless

我正在尝试使用Google Chrome替代PhantomJS将HTML呈现为PDF.到目前为止,它对我来说一直很好.我唯一的问题是我没有找到任何方法来翻译以下PhantomJS代码:

page.paperSize = {
  footer: {
    contents: phantom.callback(function(pageNum, numPages) {
      return "Power by MyWebsite. Created on "+formatDate(new Date())+"<span style='float:right'>" + pageNum + " / " + numPages + "</span>";
    })
  }
}
Run Code Online (Sandbox Code Playgroud)

格式化日期与问题中的函数相同如何格式化JavaScript日期

但是,我还没有找到一种方法来在谷歌Chrome中无头复制这种行为.我正在使用来自https://github.com/cyrus-and/chrome-remote-interface的 Chrome远程接口(CDP)

这是我的chrome远程接口代码的概述:

return new Promise(async function (resolve, reject) {
    const url = "<MyURL here>";
    const [tab] = await Cdp.List()
    const client = await Cdp({ host: '127.0.0.1', target: tab });
    await Promise.all([
       Network.enable(),
       Page.enable()
    ]);

    Page.loadEventFired(function () { 
         setTimeout(function () {
             resolve(Page.printToPDF({displayHeaderFooter:true}))); //https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-printToPDF
         }, 3000);
    });
    await Page.navigate({ url }); 
};
Run Code Online (Sandbox Code Playgroud)

我得到的PDF很好,但只能获得默认的Chrome页眉和页脚.有什么方法可以修改它们?

注意:我意识到我可以在页面中使用JavaScript将元素附加到每个页面的底部,但我更喜欢在导出/打印时更改浏览器附加的页脚,因为我发现它更可靠正确放置并且不会导致页面中其他div的任何奇怪的重新流动.

Dar*_*all 16

可以使用<header><footer>标记创建自定义页眉和页脚.我使用它来使用Chrome Headless生成PDF.我还没有在Firefox,IE等中测试它...

<header>
  Custom Header
  <img src="http://imageurl.com/image.jpg"/>
</header>
<div class="content">Page Content - as long as you want</div>
<footer>
  Footer Content
</footer>
Run Code Online (Sandbox Code Playgroud)

CSS

@page {
  margin: 0;
}
@media print {
  footer {
    position: fixed;
    bottom: 0;
  }
  header {
    position: fixed;
    top: 0;
  }
}
Run Code Online (Sandbox Code Playgroud)

@page { margin: 0 }删除默认的页眉和页脚.

希望这可以帮助.


apo*_*fos 15

这是对问题的更新/回答.从Chromium 64开始,可以使用headerTemplatefooterTemplate参数来实现printToPDF

使用chrome远程接口这里应该有效的示例代码:

return new Promise(async function (resolve, reject) {
    const url = "<MyURL here>";
    const [tab] = await Cdp.List()
    const client = await Cdp({ host: '127.0.0.1', target: tab });
    await Promise.all([
       Network.enable(),
       Page.enable()
    ]);

    Page.loadEventFired(function () { 
         setTimeout(function () {
    //https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-printToPDF
             resolve(Page.printToPDF({
                  displayHeaderFooter:true,
                  footerTemplate: "<span class='pageNumber'> of <span class='totalPages'>"
             }))); 
         }, 3000);
    });
    await Page.navigate({ url }); 
};
Run Code Online (Sandbox Code Playgroud)

  • 请注意,无法将参数“displayHeaderFooter”传递给 chrome CLI。https://cs.chromium.org/chromium/src/headless/app/headless_shell_switches.cc?sq=package:chromium&amp;type=cs&amp;g=0 中支持的 chrome headless cli 参数列表。在 Nodejs 中使用 puppeteer 或通过任何其他语言的 websocket 连接到 DevTools。 (2认同)

Mas*_*ase 8

您的问题有两种解决方案

A)通过不留余量推出铬标头:

 @page { 
     margin: 0;
     size: auto;
 }
Run Code Online (Sandbox Code Playgroud)

要么

 @media print {
   @page { margin: 0; }
   body { margin: 1.6cm; }
 }
Run Code Online (Sandbox Code Playgroud)

B)最初是一个适用于Chrome的Firefox解决方案

 <html moznomarginboxes mozdisallowselectionprint>
Run Code Online (Sandbox Code Playgroud)

一些样本:

<!DOCTYPE html>
<html moznomarginboxes mozdisallowselectionprint>
<head>
<title>Print PDF without header</title>
<style>
@media print {
    @page { margin: 0; }
    body { margin: 1.6cm; }
}
</style>
</head>
<body>
<p>Some Text in Paragraph to print!</p>
<a href="javascript:print()">Print</a>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 问题不在于推出默认的 chrome 页眉/页脚,而是关于自定义它们。 (3认同)

Cha*_*a G 8

更新

在打印为 PDF 时,您可以使用headerTemplatefooterTemaplate参数来自printToPDF定义页眉和页脚。

headerTemplatefooterTemaplate接受有效的 HTML 标记,您可以使用以下类将打印值注入您的 HTML 元素:

  • date - 将以可打印格式将当前日期注入包含该类的 HTML 元素中
  • title - 文件名
  • url - 文件位置
  • pageNumber - 当前页码
  • totalPages - 总页数

例如,打印页码和总页数:

Page.printToPDF({
    displayHeaderFooter: true,
    footerTemplate: "<span class='pageNumber'></span> <span>out of</span> <span class='totalPages'></span>"
})
Run Code Online (Sandbox Code Playgroud)

原来的

(当时,使用 Chrome DevTools 无法实现这一点。)

根据这个论坛,目前没有办法在谷歌浏览器中做到这一点。您所能做的就是打开或关闭页眉/页脚。这由评论表明:

目前没有办法在打印文档时编辑标题。您目前只能打开或关闭页眉和页脚,其中包括日期、网页名称、页面 URL 以及您正在打印的文档页数。您可能想查看 Chrome 网上应用店,看看是否有任何方便的第三方扩展程序可以安装在 Chrome 上,这些扩展程序可能适合您在打印方面的需求——来源 可能有第三方扩展程序获得您正在寻找的功能,或者按照您的建议,您可以使用 JavaScript 来附加要打印的元素。