在之前,州的先生为了在觅道文档中实现 markdown 转 pdf 的功能,考察和调研的市面上的一些通行解决方案,详见https://zmister.com/archives/1607.html。

在那之后,觅道稳定选择了 Chromium + pyppeteer 的方案作为 HTML 转换 PDF 的技术栈。

但是这个方案并非完美,由于 PyPeeteer 这个第三方库年久失修,很多 Bug 没有修复,导致在觅道文档中调用它经常性地会出现异常。

不得已,州的先生只得另寻它法。由于觅道文档中生成的 PDF 是需要动态渲染一些图形的(比如 Echarts 图表、思维导图、流程图等),所以只能在基于浏览器内核进行渲染的工具中进行选择。因为 whtmltopdf 使用的是老旧的 webkit 作为渲染内核,第一个就将其否决掉。

然后基于对 PyQt5 的熟悉,在 Windows 上使用 PyQt5 的 QWebengine 小部件对 HTML 文件进行 PDF 转换,测试效果还行。结果代码上传到 Linux 服务器上之后,各种系统依赖性的确实和报错。考虑到安装部署的便捷性,只能放弃这个测试了很久的方案。

最后转向了使用 Selenium 调用 Chromium 浏览器的无头模式,将打开的 HTML 打印导出为 PDF,算是比较完美地解决了觅道文档中文集导出 PDF 的问题。下面来看看最核心的实现过程:

依赖库

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

import base64

配置 chrome 的启动参数

webdriver_options = Options()

webdriver_prefs = {}

webdriver_options.add_argument('--headless')

webdriver_options.add_argument('--disable-gpu')

webdriver_options.add_argument('--no-sandbox')

webdriver_options.add_argument('--disable-dev-shm-usage')

webdriver_options.experimental_options['prefs'] = webdriver_prefs

webdriver_prefs['profile.default_content_settings'] = {'images': 2}

实例化一个 Chrome

首先在 Selenium 中 实例化一个 Chrome 对象:

driver = webdriver.Chrome(executable_path=settings.CHROMIUM_DRIVER_PATH,options=webdriver_options)

然后请求 HTML 文件,path 为 HTML 文件路径,也可以为 url:

driver.get(path)

加载及处理

首先等待请求加载的完成:

WebDriverWait(driver, timeout).until(staleness_of(driver.find_element_by_tag_name('html')))

然后,配置一个用于打印命令的字典:

calculated_print_options = {

'landscape': False,

'displayHeaderFooter': False,

'printBackground': True,

'preferCSSPageSize': True,

}

接着,获取 selenium 当前 session 的相关信息,使用让 Chrome 执行 Page.printToPDF 这一用于打印页面的命令:

resource = "/session/%s/chromium/send_command_and_get_result" % driver.session_id

url = driver.command_executor._url + resource

body = json.dumps({'cmd': 'Page.printToPDF', 'params': calculated_print_options })

response = driver.command_executor._request('POST', url, body)

获取到最后的响应:

result = response.get('value')

最后将响应写入文件之中:

with open('report.pdf', 'wb') as file:

file.write(result)

这样,就实现了 HTML 到 PDF 文件的转换。

模块调用

实际上,Pypi 中已经存在第三方模块实现了上述的流程,并且添加了 PDF 文件压缩的功能。通过如下命令即可安装使用:

pip install pyhtml2pdf

具体的使用方法详见:https://pypi.org/project/pyhtml2pdf/

上述实现的觅道文档代码位于:https://gitee.com/zmister/MrDoc/blob/master/app_doc/report_html2pdf.py

分享到:

chrome html导出pdf,使用Selenium实现HTML转PDF相关推荐

  1. 在 chrome 上导出 pdf

    用html+css写出网页,然后在chrome上导出pdf 1. command + p:快捷呼出打印: 2. "目标打印机":选择"更改",之后选择" ...

  2. c 将html导出pdf文件,将HTML页面转换为PDF文件并导出

    目碎前整要们开自近事端个广的的带近事端个广前,在大多数的管理系统中,都会有这样一个功能:根据相关的条件查询相应的数据,并生成可视化报表,然后可导出为PDF文件.本文只展现生成可视化报表之后导出PDF文 ...

  3. Chrome怎么导出扩展程序(插件)为crx文件

    ** Chrome怎么导出扩展程序(插件)为crx文件 ** 1.打开扩展程序页 打开Chrome菜单中的"更多工具"项中的"扩展程序".当然,你也可以打开&q ...

  4. Java——EasyPoi导出word文档,itextpdf转换pdf

    EasyPoi导出word文档,itextpdf转换pdf 文章目录 EasyPoi导出word文档,itextpdf转换pdf 前言 一.依赖 二.工具类 1.WordUtil 2.PDF工具类 3 ...

  5. 基于C#的AE二次开发导出地图为JPG、TIF、PDF图片

    基于C#的AE二次开发导出地图为JPG.TIF.PDF图片 我的开发环境为ArcGIS Engine 10.2与Visual studio2010.创建一个菜单或按钮,创建一个点击事件,粘贴代码即可实 ...

  6. ie如何导入html文件类型,Magicodes.IE: 导入导出通用库,支持Dto导入导出以及动态导出,支持Excel、Word、Pdf和Html。...

    Magicodes.IE 导入导出通用库,支持Dto导入导出以及动态导出,支持Excel.Word.Pdf和Html. 疯狂的徽章 GitHub Azure DevOps Build Status: ...

  7. 福昕风腾pdf导出为html,福昕风腾PDF套件快速指引.pdf

    福昕风腾PDF套件快速指引 福昕风腾PDF 套件 快速指南 1 福昕风腾PDF 套件 快速指南 福昕风腾PDF 套件 快速指南 本文简要介绍了福昕风腾 PDF 套件的主要功能.如需详细的操作帮助,请参 ...

  8. PHP fpdi合并多个PDF文件,取多个PDF特定页数合并以及导出

    在说之前,先说明一下,FPDI 插件,不能操作被 pdf 软件编辑过的 pdf 文件. 在我们写项目的时候,经常需要对PDF文件进行操作.例如:合并多个PDF文件,取PDF特定页数以及合并. PHP ...

  9. vue页面导出pdf文档并上传pdf格式给后台

    下载依赖 yarn add html2canvas // 将页面html转换成图片 yarn add jspdf // 将图片生成pdf 定义全局函数,创建htmlToPdf.js文件 import ...

最新文章

  1. 真能一快遮百丑?为什么要弃坑 FastJson
  2. 【目录】C#操作Excel组件Spire.XLS系列文章目录
  3. 查看linux安装redis的位置,linux查看是否安装redis
  4. mongodb 入门笔记
  5. ip和端口正则表达式
  6. 广州市科目三电子路考--大观路通过经验
  7. dropbox_在5分钟内学习Dropbox API
  8. Nodejs 使用express模块创建一个服务器
  9. android 字符串转字节数组,java – 在Android中将字节数组转换为Charsequence
  10. 免费内网映射外网绑定,tcp端口转发(windows)
  11. 找回 Windows 丢失的拨号密码
  12. 将Imagenet2012比赛数据解析为图像
  13. vue 使用html自带title属性 鼠标悬浮展示内容 修改其样式
  14. Jedis的hget方法简单用法
  15. 【python实现网络爬虫21】天眼查企业数据获取
  16. 模型思考笔记2—分类和同群效应带来的思考
  17. 三重视角看陈彤:一个网媒老兵的谢幕
  18. c语言编译kbhit出现问题,kbhit用C语言
  19. 前后端对接及接口管理平台浅析
  20. CSS实现水波纹效果

热门文章

  1. 打破富不过三代神话 荣智健中兴百年家业
  2. 网站关键词如何设置覆盖上百个关键词(佐伊科技分享干货)
  3. 如何解决百度云下载慢的问题
  4. ORA-01122;ORA-01110;ORA-01207问题解决经验总结
  5. Android UI绘制流程分析(三)measure
  6. 基础面试题:java内存区域
  7. Bootstrap 响应式布局模板
  8. 2020年 ICLR 国际会议最终接受论文(poster-paper)列表(二)
  9. Windows Vista 发布 | 历史上的今天
  10. Oracle利用start with子句实现递归查询