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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:41:00