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

使用Python的xhtml2pdf模块转HTML为PDF时遇类型及图片路径错误

解决xhtml2pdf渲染HTML为PDF时的图片路径错误问题

遇到的错误信息:

expected string or bytes-like object, got 'NoneType'
Need a valid file name!
''
Need a valid file name!
''
Need a valid file name!
''

问题原因

这些错误是因为xhtml2pdf无法正确解析HTML中的相对图片路径。默认情况下,该模块会以Python脚本的运行目录作为基准查找图片文件,而非HTML模板所在的目录,导致找不到指定的图片资源,进而抛出"Need a valid file name!"错误,最终引发NoneType相关异常。

解决方案

方案1:指定图片查找的基准路径(推荐)

修改代码,在调用pisa.CreatePDF时添加path参数,明确指向HTML模板所在的目录,让xhtml2pdf以此为基准解析图片的相对路径。示例代码如下:

import sys
import os
from xhtml2pdf import pisa

OUTPUT_FILENAME = "test.pdf"
TEMPLATE_FILE = "templates/test.html"


def html_to_pdf(content, output, base_path):
    # 打开输出文件
    result_file = open(output, "w+b")

    # 转换HTML到PDF,指定图片基准路径
    pisa_status = pisa.CreatePDF(
        content,
        dest=result_file,
        path=base_path
    )

    result_file.close()
    result = pisa_status.err

    if not result:
        print("PDF创建成功")
    else:
        print("错误:无法创建PDF")
    return result


def from_template(template, output):
    # 读取模板文件
    source_html = open(template, "r")
    content = source_html.read()
    source_html.close()

    # 获取模板文件的目录作为图片查找基准路径
    base_path = os.path.dirname(os.path.abspath(template))
    html_to_pdf(content, output, base_path)


from_template(TEMPLATE_FILE, OUTPUT_FILENAME)

方案2:使用绝对路径(灵活性差)

直接在HTML模板中将图片的src改为绝对路径,例如:

<img src="/home/user/project/templates/assets/images/db.png"/>

这种方式不推荐,因为路径固定,移植性差。

方案3:切换脚本运行目录

运行Python脚本时,先切换到HTML模板所在的上级目录,确保脚本运行目录与图片相对路径的基准一致。例如模板在templates/目录,就先执行cd project_root再运行脚本,但这种方式依赖运行环境,稳定性不足。

内容的提问来源于stack exchange,提问作者Akram Hossain Rahat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:20:54