Streamlit PDF报告应用字体路径异常问题求助
Streamlit PDF生成应用字体路径不生效问题排查与解决
我开发的Streamlit PDF报告生成应用在本地运行正常,但发给同事后无法工作。已经将脚本中的字体路径从my_path/font.tff修改为同事电脑上的her_path/font.tff,但应用仍试图查找原路径。报错出现在下载按钮处,不过按钮代码本身并未涉及字体路径,代码如下:
st.download_button( 'Download Report', data=pdf.output(dest='S').encode('latin-1'), file_name=f'fint_test_{nombre.title()}_{user}.pdf' ) return
可能的原因
- 缓存残留:Streamlit或PDF生成库(如FPDF、ReportLab)可能缓存了初始的字体加载信息,修改路径后未触发重新加载
- 字体加载逻辑触发时机不对:字体加载代码如果写在模块初始化阶段,只会执行一次,后续修改路径不会生效
- 硬编码路径遗漏:代码其他地方或配置文件中可能还存在原路径的引用,没完全替换
解决方法
- 清除Streamlit缓存:让同事在启动应用前执行命令:
streamlit cache clear,或者在应用代码开头添加st.cache_data.clear()(如果使用了缓存装饰器),确保旧的字体路径缓存被清空 - 改用动态路径/用户选择:避免硬编码路径,让同事通过文件选择器指定字体文件,示例代码:
font_file = st.file_uploader("选择字体文件", type=["ttf"]) if font_file: # 临时保存字体到本地临时文件 temp_font_path = "temp_custom_font.ttf" with open(temp_font_path, "wb") as f: f.write(font_file.getbuffer()) # 使用临时路径加载字体 pdf.add_font("CustomFont", "", temp_font_path, uni=True) - 检查字体加载位置:确保字体加载的代码在每次生成PDF前都重新执行,比如放在生成PDF的函数内部,而不是模块级别的全局代码里
- 全局搜索路径引用:在整个代码库(包括配置文件、.env等)中搜索
my_path/font.tff,确认所有引用都已替换为新路径
内容的提问来源于stack exchange,提问作者Hugo Arellano
相关产品推荐
相关产品推荐

