当前位置: 首页 > news >正文

在Linux系统中将html保存为PNG图片

1 前言

之前使用Pyecharts库在Windows系统中生成图表并转换为PNG格式图片(传送门),现将代码放于Linux服务器上运行,结果发现错误,生成html文件之后无法保存图片。

2 原理

基于Selenium库的保存方案,其原理是使用Chrome浏览器打开html文件,然后在进行截图

3 实现

3.1 环境准备

安装Chrome和Chrome Driver

1 安装 Chrome
yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm

chromedriver 下载地址:
https://googlechromelabs.github.io/chrome-for-testing/ (推荐,包含最新稳定版)

这里需要下载和Chrome版本一致的Driver

# 下载 chromedriver
# 进入下载目录
cd /tmp

# 查看chrome 版本号
google-chrome --version

# 在chromedriver下载地址中找到对应版本,下载对应版本chromedriver
# 如
wget https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/118.0.5993.70/linux64/chromedriver-linux64.zip

# 解压
unzip chromedriver-linux64.zip 

# 赋权
cd chromedriver-linux64
mv chromedriver /usr/local/bin
cd /usr/local/bin
chmod +x chromedriver

3.2 代码

import os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

def split_filepath(filepath):
    """
    此函数用于从文件路径中提取文件名(不含扩展名)。

    参数:
    filepath (str): 完整的文件路径

    返回:
    str: 文件名(不包含扩展名)
    """
    # 获取目录路径和完整文件名(含扩展名)
    filename_with_ext = os.path.basename(filepath)

    # 分离文件名和扩展名
    filename, ext = os.path.splitext(filename_with_ext)

    return filename

def save_as_png(html_file, img_file):
    """
    该函数的作用是将指定的 HTML 文件在浏览器中打开并截图保存为 PNG 图片。

    参数:
    html_file (str): 要截图的 HTML 文件的完整路径
    img_file (str): 保存截图的 PNG 文件的完整路径


    返回:
    None
    """
    # chrome-driver 安装路径
    DRIVER_PATH = "/usr/local/bin"

    # 浏览器基础配置
    options = Options()
    options.add_argument('--no-sandbox')
    options.add_argument('--headless')  # 无头参数
    options.add_argument('--disable-gpu')  # 禁用gpu 防止占用资源出现bug
    options.add_argument('window-size=1920x800')  # 设置分窗口辨率
    options.add_argument('--start-maximized')  # 最大化运行(全屏窗口),不设置,取元素可能会报错
    options.add_argument('--hide-scrollbars')
    s = Service(DRIVER_PATH)
    # 启动浏览器
    driver = webdriver.Chrome(service=s, options=options)
    # 设置隐式等待时间,在查找元素时最多等待 10 秒
    driver.implicitly_wait(10)
    try:
        # 调用 split_filepath 函数获取 HTML 文件的文件名(不含扩展名)
        img_name = split_filepath(html_file)
        # 打印开始截图的提示信息
        print("开始截图")
        # 在浏览器中访问指定的 HTML 文件
        driver.get(f"file://{html_file}")
        # 对当前页面进行截图并保存为指定的 PNG 文件
        driver.get_screenshot_as_file(img_file)
        # 打印完成截图的提示信息
        print("完成截图")
    except Exception as e:
        # 若截图过程中出现异常,打印异常信息
        print(e)
    finally:
        # 关闭当前浏览器窗口
        driver.close()
        # 退出浏览器驱动程序,释放资源
        driver.quit()

这里的重点是driver.get(f"file://{html_file}"),在需要打开的html文件路径前加上file://,否则driver会默认是url,导致超时错误。

3.3 字体

如果在html文件中存在中文的,需要保证Linux安装有中文字体

#查看已安装的字体
#查看已安装的字体
fc-list
#查看已安装的中文字体
fc-list :lang=zh

#安装Linux字体程序
yum -y install fontconfig

#安装中文字体
#查看服务器是否有:/usr/share/fonts这个目录,如果有,那么看下一步,如果没有,就创建
mkdir -p /usr/share/fonts

#引入字体文件
#将准备好的字体放到/usr/share/fonts这个目录

#安装字体索引
yum install mkfontscale

#生成字体索引,在/usr/share/fonts这个目录执行下面的命令
mkfontscale

#第三步验证安装结果
fc-list :lang=zh

4 参考链接
linux下安装 Chrome 和 chromedriver 以及 selenium webdriver 使用

如何给Linux系统安装中文字体

python中使用selenium打开保存在本地的html页面

相关文章:

  • 将 char [] str = “hello,you,world” 改为 “world,you,hello“,要求空间复杂度为1
  • 硬链接和软链接
  • uvm factory
  • SvelteKit 最新中文文档教程(13)—— Hooks
  • spring security的过滤器链
  • 基于redis实现会话保持
  • react native 0.72.5集成react-navigation
  • 使用idea开发spark程序
  • 2025年数智化电商产业带发展研究报告260+份汇总解读|附PDF下载
  • uWebSockets开发入门
  • ai-api-union项目,适配各AI厂商api
  • win32汇编环境,网络编程入门之十四
  • 不落因果与不昧因果
  • nginx refer与origin的异常数据拦截
  • Ollama - 官方文档翻译
  • Redis的List类型
  • 自动化发布工具CI/CD实践Jenkins各配置功能介绍和管理!
  • 3.28 代码随想录第二十九天打卡
  • uvm phase
  • 海康威视摄像头混合目标检测事件数据说明文档
  • 做百度网站多少钱/中国企业500强
  • wordpress建立数据库时出错/seo竞价培训
  • 国外wordpress主机/seo网络推广公司排名
  • 武汉哪家做网站/搜索引擎排名规则
  • 网站兼容ie7/视频剪辑培训
  • 辽宁省住房和城乡建设厅官方网站/网络营销形式