You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中用WeasyPrint生成PDF时Folium地图无法显示的问题

解决Folium地图通过WeasyPrint生成PDF无法显示的问题

你遇到的问题根源在于folium.Map._repr_html_()方法返回的是Jupyter Notebook专用的预览HTML片段,它依赖Notebook的信任机制加载地图资源,并非完整可独立运行的地图HTML代码,所以直接用这个字符串生成PDF时,会显示Notebook的信任提示,地图无法正常加载。

解决步骤

  1. 获取完整的地图HTML内容:不要使用_repr_html_(),而是通过folium.Map.save()方法生成包含所有必要资源引用的完整HTML(包括Leaflet的CSS、JS以及地图瓦片加载逻辑)。
  2. 用WeasyPrint渲染完整HTML:将完整HTML内容传递给WeasyPrint的HTML类,确保它能正确解析并加载所有外部资源(需要网络连接加载CDN资源,离线环境需提前下载资源并修改引用路径)。

修改后的代码

import folium
from weasyprint import HTML
import tempfile
import os

def generate_map_html(lat: float, lon: float):
    """生成包含完整资源引用的地图HTML字符串"""
    # 创建Folium地图实例
    m = folium.Map(location=[lat, lon], zoom_start=15)
    # 添加标记点
    folium.Marker([lat, lon], popup='Property Location').add_to(m)
    
    # 使用临时文件生成并读取完整HTML
    with tempfile.NamedTemporaryFile(mode='w', suffix='.html', delete=False) as tmp_file:
        m.save(tmp_file.name)
    
    # 读取完整HTML内容
    with open(tmp_file.name, 'r', encoding='utf-8') as f:
        full_map_html = f.read()
    
    # 删除临时文件
    os.unlink(tmp_file.name)
    
    return full_map_html

# 生成地图HTML
map_html = generate_map_html(33.589886, -7.603869)

# 渲染HTML为PDF
html = HTML(string=map_html)
pdf_content = html.write_pdf()

# 保存PDF文件
with open('out/output.pdf', 'wb') as f:
    f.write(pdf_content)

离线环境适配(可选)

如果你的运行环境没有网络,需要:

  • 下载Leaflet的CSS、JS文件以及地图瓦片资源到本地
  • 修改Folium地图的配置,使用本地资源路径替代CDN链接,确保WeasyPrint能找到这些资源

内容的提问来源于stack exchange,提问作者Saad Mrabet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 09:22:08