剧情回顾
最近产品部的老大提了个需求,要快速能把某些网址的医疗新闻打印成pdf,方便他们当素材。这个需求兜兜转转最后还是落在了我这个小前端身上,没办法,毕竟现在的活不多,导致我摸鱼的时候放松警惕,被发现了……
页面url获取
打印页面的第一步首先要获取页面的地址,这点需要根据具体的页面示例去调整,大家可以参考我碰到的需求。
比如我们产品部要打印第一页到第五页的所有页面,当然人家肯定不会给你提供页面链接,毕竟要一个一个去点。这种情况下我们可以选择先查看代码结构,在根据结构调整代码获取地址。
首先在控制台(f12),我们看到这个页面组成,每个标题下都是一个a标签,并且其最上有一个名为 searchresult 的大类名,知道了他的结构,现在我们就可以根据结构在控制台进行操作了。
var array = [] // 记录链接
var alist = document.querySelectorAll('.searchresult table a') // 获取全部a标签
for (let a of alist){
array.push(a.href) // 获取a标签的链接属性
}
console.log(array) // [...]
获取完链接查看一下,我们继续进行下一步。
打印页面为PDF
在打印之前首先我们要下载一个 chromedriver 的驱动,用以操作浏览器。注意这里要记住安装路径。
下载地址:https://googlechromelabs.github.io/chrome-for-testing/
下载并安装完成后,我们新建一个index.py,输入如下代码
import os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import json
from time import sleep
save_path = os.getcwd() # 当前文件所在的文件夹路径
options = Options()
settings = {
"recentDestinations": [{
"id": "Save as PDF",
"origin": "local",
"account": ""
}],
"selectedDestinationId": "Save as PDF",
"version": 2, # 另存为pdf,1 是默认打印机
"isHeaderFooterEnabled": False, # 勾选页眉和页脚
"isCssBackgroundEnabled": True, # 勾选背景图形
"mediaSize": {
"height_microns": 297000,
"name": "ISO_A4",
"width_microns": 210000,
"custom_display_name": "A4",
},
}
prefs = {
'printing.print_preview_sticky_settings.appState': json.dumps(settings),
'savefile.default_directory': save_path,
}
options.add_argument('--enable-print-browser')
options.add_argument('--kiosk-printing') # 静默打印无需点击打印页面的确定按钮
options.add_experimental_option('prefs', prefs)
service = Service(executable_path="D:\chromedriver-win64\chromedriver.exe") # 谷歌浏览器驱动路径
driver = webdriver.Chrome(service=service, options=options)
# 页面地址复制到这里
urls = []
for url in urls:
driver.get(url)
# 1.自定义代码执行,修改页面内容时可以在此插入代码,修改样式或者名称等
driver.execute_script(f'document.title="页面名称"')
# 2.打印网页
driver.execute_script('window.print();')
# 等待html加载pdf打印,如果图片多可以加大调整
sleep(3)
输入完成后,我们在控制台执行 index.py 文件,即完成打印
python index.py