python实现网页/HTML截图并转PDF

通过Python,Node等服务端程序对现有网站或者HTML文件在不打开浏览器窗口的情况下进行截图,可以很方便的实现某些需求。如

  • 实现办公自动化,将数据制作成<tr><td>表格或者图表后截图保存为PDF或图片,发送到通讯软件中
  • GEO程序的开发,可以把地图和上面的自定义标记截图下来,以图片形式嵌入到自己应用中,这样就不需要集成地图SDK了
  • 网站的定期自动化快照,可以保留网站变化历史
  • 增强对浏览器和移动端的支持,对于无法渲染HTML5的浏览器,可以直接以图片代替

等等需求还有很多。下面介绍集中常用的方法。

方案一:Python+wkhtmltopdf

这个是百度出来最常见的方案,通过下载wkhtmltopdf/wkhtmltoimg工具,然后在python中进行跨进程调用,实现截图和保存为PDF,首先我们需要先上其官网下载Driver文件,其实就是一个Headless无窗口的虚拟浏览器,其内核为QtWebKit,类似早期苹果手机的Sarfari,对HTML5的支持较差

其官网为:https://wkhtmltopdf.org/downloads.html 支持Linux和Windows服务器,并且支持多种CPU的架构

1、保存为图片

import imgkit
import pdfkit

if __name__ == '__main__':
    path_wkimg = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltoimage.exe'  # 工具路径,需要替换为服务器的真实路径
    cfg = imgkit.config(wkhtmltoimage=path_wkimg)
    options = {
        'javascript-delay': '2000',
        'height': '1500',
        'width': '2000'
    }
    # 1、将html文件转为图片
    imgkit.from_file(r'F:/map.html', 'map.jpg', config=cfg, options=options)
    # 2、从url获取html,再转为图片
    imgkit.from_url('https://html5test.com/', 'h5.jpg', config=cfg, options=options)
    # 3、将字符串转为图片
    imgkit.from_string('<h1>Hello!</h1>', 'hello.jpg', config=cfg)

javascript-delay是等待js执行的时间,而不是等HTML都加载完直接截图,根据实际页面渲染时间来定

height和width是浏览器窗口的大小,可以超过显示器的实际大小(服务器上没有浏览器也无所谓),所以如果要截取整个页面,需要把height设置到和预估的网页高度一样。

如果不设置height,可以自动截取到页面底端,但是往往测算的会有问题,远远超出实际的大小,后文会有详细的测试

 

2、保存为PDF

import pdfkit

if __name__ == '__main__':
    cfg = imgkit.config(wkhtmltoimage=path_wkimg)
    options_pdf = {
        'javascript-delay': '15000',
        'margin-bottom': '20mm',
        'footer-line': None
    }
    path_wkpdf = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'  # 替换为服务器的真实路径
    config = pdfkit.configuration(wkhtmltopdf=path_wkpdf)
    url = 'https://html5test.com'
    pdfkit.from_url(url, 'h5.pdf', configuration=config, options=options_pdf)
    pdfkit.from_file('C:/echats.html', options=options_pdf,configuration=config,output_path='echarts.pdf')

方案二:Python+selenium

selenium是很火的Python前端自动化测试框架,通过指定chrome浏览器的Driver,可以在有窗口或Headless的情况下进行截图,但是无法转换为PDF,也无法自动截取全高度网页,必须指定窗口大小

有点是ChromeDriver可以在Headless或窗口模式下执行,只需要指定--headless参数即可。这样就可以在程序执行的时候观察实际效果。并且selenium还可以在页面上执行自定义js代码,用来滚动屏幕,非常好用

下载ChromeDriver的地址是:https://sites.google.com/chromium.org/driver/downloads?authuser=0

from selenium import webdriver
from selenium.common.exceptions import WebDriverException

if __name__ == '__main__':
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    options.add_argument('--disable-gpu')
    options.add_argument('--no-sandbox')
    options.add_argument('window-size=1920x1080')


    try:
        driver = webdriver.Chrome(executable_path='chromedriver_win32/chromedriver.exe', options=options)
        # driver.get("file:///C:/map.html"
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值