热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

页眉和页脚打印如何在Puppeter的page.pdfAPI中工作?

如何解决《页眉和页脚打印如何在Puppeter的page.pdfAPI中工作?》经验,为你挑选了2个好方法。

在尝试使用headerTemplatefooterTemplate选项时,我注意到了一些不一致page.pdf:

页眉和页脚的DPI似乎更低(我认为主体为72比96).因此,如果我想要匹配边距,我必须按比例缩放.

样式不与主体共享,因此我必须将它们包含在模板中.

如果我尝试使用本地存储的字体,它可以在主体上工作,但不在页眉/页脚中,即使我在页眉/页脚模板中包含相同的CSS.

我怀疑这是因为页眉和页脚被视为单独的文档并分别转换为image/pdf(https://cs.chromium.org/chromium/src/components/printing/resources/print_header_footer_template_page.html也暗示类似的东西).熟悉该实现的人是否可以解释它实际上是如何工作的?谢谢!



1> Grant Miller..:

简答:

Puppeteer通过DevTools协议控制Chrome或Chromium .

Chromium使用Skia生成PDF.

Skia分别处理标题,一组对象和页脚.


详细解答:

从Puppeteer文档:

page.pdf(选项)

options可能具有以下属性的Options对象:

headerTemplate打印标题的HTML模板.应该是有效的HTML标记,其中包含用于将打印值注入其中的以下类:

date 格式化打印日期

title 文件名

url 文件位置

pageNumber 当前页码

totalPages 文档中的总页数

footerTemplate打印页脚的HTML模板.应该使用相同的格式headerTemplate.

返回:>使用PDF缓冲区解析的Promise.

注意目前仅在Chrome无头中支持生成pdf.


注意 headerTemplatefooterTemplate标记具有以下限制:

    不评估模板内的脚本标记.

    页面样式在模板中不可见.


我们可以从Puppeteer源代码page.pdf()中学到:

在Chrome DevTools协议方法Page.printToPDF(与沿着headerTemplatefooterTemplate参数)被发送到到page._client.

page._clientpage.target().createCDPSession()(Chrome DevTools协议会话)的一个实例.


从Chrome DevTools Protocol Viewer中,我们可以看到Page.printToPDF包含参数headerTemplatefooterTemplate:

Page.printToPDF

以PDF格式打印页面.

参数

headerTemplate 字符串(可选)

打印标题的HTML模板.应该是有效的HTML标记,其中包含用于将打印值注入其中的以下类:

date:格式化的打印日期

title: 文件名

url:文件位置

pageNumber:当前页码

totalPages:文档中的总页数

例如,将生成包含标题的span.

footerTemplate 字符串(可选)

打印页脚的HTML模板.应该使用相同的格式headerTemplate.

返回对象

data

Base64编码的pdf数据.


该铬源代码Page.printToPDF向我们表明:

Page.printToPDF参数被传递给sendDevToolsMessage函数,它发出一个DevTools协议命令并返回结果的承诺.


在进一步挖掘之后,我们可以看到Chromium具有一个称为SkDocument创建PDF文件的类的具体实现.

SkDocument来自Skia图形库,Chromium用于生成PDF.

该操作的Skia的PDF理论,在PDF对象和文档结构部分,指出:

背景:PDF文件格式有一个标题,一组对象,然后是一个页脚,其中包含文档中所有对象(交叉引用表)的目录.目录列出了每个对象的特定字节位置.对象可能具有对其他对象的引用,并且这些引用的ASCII大小取决于分配给引用对象的对象编号; 因此,在知道对象的大小之前,我们无法计算目录,这需要分配对象编号.该文档用于SkWStream::bytesWritten()查询每个对象的偏移量并构建交叉引用表.

该文件进一步解释:

该PDF后端需要在PDF中使用的所有间接对象被添加到SkPDFObjNumMapSkPDFDocument.目录负责分配对象编号并生成PDF文件末尾所需的目录.从某种意义上说,生成PDF是一个三步过程.在第一步中,创建它们中的所有对象和引用(主要由它完成SkPDFDevice).在第二步中,SkPDFObjNumMap分配并记住对象编号.最后,在第三步骤中,报头被印刷,每一个对象被印刷,然后将印刷的内容和拖车表.SkPDFDocument负责收集各种SkPDFDevice实例中的所有对象,将它们添加到一个SkPDFObjNumMap,迭代对象一次以设置其文件位置,然后再次迭代以生成最终的PDF.



2> Shrey..:

感谢其他答案(/sf/ask/17360801/)和代码搜索,我想我找到了我一直在寻找的大多数答案。

打印实现在PrintPageInternal中。它使用两个单独的WebFrames-一个用于呈现内容,一个用于呈现页眉和页脚。通过创建一个特殊的框架,将print_header_and_footer_template_page.html的内容写入此框架,setup使用提供的选项调用函数,然后打印到共享画布,来完成页眉和页脚的呈现。此后,页面的其余内容将在页边距定义的边界内打印在同一画布上。

页眉和页脚由fudge_factor缩放,而fudge_factor不适用于其余内容。DPI可能会发生一些有趣的事情(这可能解释了fudge_factor 1.33333333f等于96/72)。

我猜想这个特殊的框架会阻止页眉和页脚共享与页面内容相同的资源(样式,字体等)。可能没有设置加载(和等待)页眉和页脚模板请求的任何其他资源,这就是为什么不加载所请求的字体的原因。


推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 微软评估和规划(MAP)的工具包介绍及应用实验手册
    本文介绍了微软评估和规划(MAP)的工具包,该工具包是一个无代理工具,旨在简化和精简通过网络范围内的自动发现和评估IT基础设施在多个方案规划进程。工具包支持库存和使用用于SQL Server和Windows Server迁移评估,以及评估服务器的信息最广泛使用微软的技术。此外,工具包还提供了服务器虚拟化方案,以帮助识别未被充分利用的资源和硬件需要成功巩固服务器使用微软的Hyper - V技术规格。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
author-avatar
亚璨的秘密
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有