使用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
相关产品推荐
相关产品推荐


'
'