chrome html导出pdf,使用Selenium实现HTML转PDF
在之前,州的先生为了在觅道文档中实现 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相关推荐
- 在 chrome 上导出 pdf
用html+css写出网页,然后在chrome上导出pdf 1. command + p:快捷呼出打印: 2. "目标打印机":选择"更改",之后选择" ...
- c 将html导出pdf文件,将HTML页面转换为PDF文件并导出
目碎前整要们开自近事端个广的的带近事端个广前,在大多数的管理系统中,都会有这样一个功能:根据相关的条件查询相应的数据,并生成可视化报表,然后可导出为PDF文件.本文只展现生成可视化报表之后导出PDF文 ...
- Chrome怎么导出扩展程序(插件)为crx文件
** Chrome怎么导出扩展程序(插件)为crx文件 ** 1.打开扩展程序页 打开Chrome菜单中的"更多工具"项中的"扩展程序".当然,你也可以打开&q ...
- Java——EasyPoi导出word文档,itextpdf转换pdf
EasyPoi导出word文档,itextpdf转换pdf 文章目录 EasyPoi导出word文档,itextpdf转换pdf 前言 一.依赖 二.工具类 1.WordUtil 2.PDF工具类 3 ...
- 基于C#的AE二次开发导出地图为JPG、TIF、PDF图片
基于C#的AE二次开发导出地图为JPG.TIF.PDF图片 我的开发环境为ArcGIS Engine 10.2与Visual studio2010.创建一个菜单或按钮,创建一个点击事件,粘贴代码即可实 ...
- ie如何导入html文件类型,Magicodes.IE: 导入导出通用库,支持Dto导入导出以及动态导出,支持Excel、Word、Pdf和Html。...
Magicodes.IE 导入导出通用库,支持Dto导入导出以及动态导出,支持Excel.Word.Pdf和Html. 疯狂的徽章 GitHub Azure DevOps Build Status: ...
- 福昕风腾pdf导出为html,福昕风腾PDF套件快速指引.pdf
福昕风腾PDF套件快速指引 福昕风腾PDF 套件 快速指南 1 福昕风腾PDF 套件 快速指南 福昕风腾PDF 套件 快速指南 本文简要介绍了福昕风腾 PDF 套件的主要功能.如需详细的操作帮助,请参 ...
- PHP fpdi合并多个PDF文件,取多个PDF特定页数合并以及导出
在说之前,先说明一下,FPDI 插件,不能操作被 pdf 软件编辑过的 pdf 文件. 在我们写项目的时候,经常需要对PDF文件进行操作.例如:合并多个PDF文件,取PDF特定页数以及合并. PHP ...
- vue页面导出pdf文档并上传pdf格式给后台
下载依赖 yarn add html2canvas // 将页面html转换成图片 yarn add jspdf // 将图片生成pdf 定义全局函数,创建htmlToPdf.js文件 import ...
最新文章
- 真能一快遮百丑?为什么要弃坑 FastJson
- 【目录】C#操作Excel组件Spire.XLS系列文章目录
- 查看linux安装redis的位置,linux查看是否安装redis
- mongodb 入门笔记
- ip和端口正则表达式
- 广州市科目三电子路考--大观路通过经验
- dropbox_在5分钟内学习Dropbox API
- Nodejs 使用express模块创建一个服务器
- android 字符串转字节数组,java – 在Android中将字节数组转换为Charsequence
- 免费内网映射外网绑定,tcp端口转发(windows)
- 找回 Windows 丢失的拨号密码
- 将Imagenet2012比赛数据解析为图像
- vue 使用html自带title属性 鼠标悬浮展示内容 修改其样式
- Jedis的hget方法简单用法
- 【python实现网络爬虫21】天眼查企业数据获取
- 模型思考笔记2—分类和同群效应带来的思考
- 三重视角看陈彤:一个网媒老兵的谢幕
- c语言编译kbhit出现问题,kbhit用C语言
- 前后端对接及接口管理平台浅析
- CSS实现水波纹效果