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

使用xhtml2pdf转换图片至PDF遇文件URL错误,无法实现已有解决方案

解决xhtml2pdf图片URL转换PDF报错问题

我来帮你搞定这个xhtml2pdf处理图片时的URL报错问题~ 你之前尝试的方案没成功,大概率是因为没给xhtml2pdf配置正确的资源加载逻辑,它默认不会自动处理本地或远程图片的,得我们自己写回调函数来搞定。

完整修复后的代码

直接替换你现有的utils.py内容就行:

from io import BytesIO
import requests
from django.http import HttpResponse
from django.template.loader import get_template
from xhtml2pdf import pisa
from django.conf import settings

def fetch_resources(uri, rel):
    # 处理本地静态文件图片
    if uri.startswith(settings.STATIC_URL):
        # 把静态URL转成服务器本地的文件路径
        local_path = uri.replace(settings.STATIC_URL, f"{settings.STATIC_ROOT}/")
        return local_path
    # 处理远程网络图片
    elif uri.startswith(('http://', 'https://')):
        try:
            # 下载远程图片并返回字节流
            response = requests.get(uri)
            response.raise_for_status()
            return BytesIO(response.content)
        except requests.exceptions.RequestException:
            # 下载失败时可以返回一张默认占位图(可选,根据自己需求调整)
            return f"{settings.STATIC_ROOT}/images/default_placeholder.png"
    # 其他情况返回原URI
    return uri

def render_to_pdf(template_src, context_dict={}):
    template = get_template(template_src)
    html = template.render(context_dict)
    result = BytesIO()
    # 关键:把自定义的资源加载函数传给xhtml2pdf
    pdf = pisa.pisaDocument(
        BytesIO(html.encode("ISO-8859-1")),
        dest=result,
        encoding="ISO-8859-1",
        fetch_resources=fetch_resources
    )
    if not pdf.err:
        response = HttpResponse(result.getvalue(), content_type='application/pdf')
        response['Content-Disposition'] = 'attachment; filename="output.pdf"'
        return response
    # 生成失败时返回错误提示
    return HttpResponse("生成PDF时出错,请检查图片资源", status=500)

核心修改说明

  • 新增fetch_resources回调函数:这是xhtml2pdf要求的资源加载接口,专门用来处理HTML里的图片、样式等外部资源:
    • 本地静态图片:自动把Django的静态URL转换成服务器上的真实文件路径
    • 远程图片:用requests库下载图片内容,转成字节流给xhtml2pdf使用
  • 在pisaDocument中传入fetch_resources:这一步是让xhtml2pdf启用我们自定义的资源加载逻辑,而不是用它默认的无效处理
  • 补全编码和错误处理:把你代码里缺失的编码(ISO-8859-1)补全,还加了PDF生成失败的响应处理

额外注意事项

  • 确保你的Django项目settings.py里正确配置了STATIC_ROOT和STATIC_URL
  • 如果用远程图片,要确保你的服务器能访问到对应的图片URL,必要时可以加超时或代理设置
  • 本地图片如果还是有问题,检查一下文件权限,确保xhtml2pdf进程能读取到图片文件

内容的提问来源于stack exchange,提问作者questnofinterest

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:32:53