Python中用WeasyPrint生成PDF时Folium地图无法显示的问题
解决Folium地图通过WeasyPrint生成PDF无法显示的问题
你遇到的问题根源在于folium.Map._repr_html_()方法返回的是Jupyter Notebook专用的预览HTML片段,它依赖Notebook的信任机制加载地图资源,并非完整可独立运行的地图HTML代码,所以直接用这个字符串生成PDF时,会显示Notebook的信任提示,地图无法正常加载。
解决步骤
- 获取完整的地图HTML内容:不要使用
_repr_html_(),而是通过folium.Map.save()方法生成包含所有必要资源引用的完整HTML(包括Leaflet的CSS、JS以及地图瓦片加载逻辑)。 - 用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
相关产品推荐
相关产品推荐

