Flask服务中WeasyPrint生成PDF无法显示图片问题
解决WeasyPrint生成PDF无法加载PNG/JPEG图片的问题
核心问题:base_url参数格式错误
你当前传入的base_url = app.static_folder是本地文件夹路径(比如/home/user/project/static),但WeasyPrint的HTML类要求base_url是URL格式(比如file:///home/user/project/static或者Flask的静态文件URL),它需要通过URL规则解析图片路径,而非直接读取本地目录。
具体修复方案
修正base_url为URL格式
把路由里的base_url改成文件URL格式:import os # 转换本地静态文件夹路径为file://格式的URL base_url = f"file://{os.path.abspath(app.static_folder)}"若图片通过Flask静态路由访问,也可以用:
from flask import url_for base_url = url_for('static', filename='', _external=True)确保HTML中的图片路径正确
HTML里的图片src要对应静态文件夹下的相对路径,比如静态文件夹下有images/logo.png,HTML中应写:<img src="images/logo.png" />禁止使用绝对本地路径,必须基于base_url设置相对路径。
检查WeasyPrint依赖完整性
WeasyPrint加载JPEG/PNG需要依赖库,Conda环境下建议直接从conda-forge安装完整包:conda install -c conda-forge weasyprint避免用pip单独安装导致依赖缺失。
验证文件权限
确保Flask运行用户有读取静态文件夹内图片的权限,Linux/macOS下可执行:chmod -R 644 /path/to/your/static/folder
修正后的路由代码示例
import os @app.route("/test_pdf") def test_pdf(): conv = Converter() try: filename = "diagnostic.pdf" string_html = conv.insert_text_by_class(dict_input_weasy) # 转换静态文件夹路径为file:// URL base_url = f"file://{os.path.abspath(app.static_folder)}" pdfOK = conv.convert_html_to_pdf( string_html, filename, base_url) return make_response("PDF created successfully!", OK) except Exception as e: print(e) return make_response("An error occurred during PDF creation.", INTERNAL_SERVER_ERROR)
内容的提问来源于stack exchange,提问作者Luís Felipe Araujo de Oliveira
相关产品推荐
相关产品推荐

