12

正如文档页面中所说,我在我的 html 文件中定义了一个 img 标记,如下所示:

<img src='{% static 'image.png' %}'/>

这个 url 存在于服务器中,我什至用 http 响应做了一个不同的视图,图像显示得很好。这是两个视图的代码:

pdf-weasyprint 视图:

def card_view(request):
    template = loader.get_template('card.html')
    context = {'sample': None
               }
    html = template.render(RequestContext(request, context))
    response = HttpResponse(mimetype='application/pdf')
    HTML(string=html).write_pdf(response)
    return response

html视图:

def card_view2(request):
    context = {'sample': None,
               }
    return render_to_response('card.html', context, 
                              context_instance=RequestContext(request))

我认为默认的 url 提取器应该找到并渲染图像(它是 png - 所以不应该涉及格式问题)有什么想法吗?任何帮助,将不胜感激!!

4

2 回答 2

28

究竟是什么问题?你在日志中得到什么吗?(如果您的服务器不记录 stderr,您可能需要配置日志记录。)生成的 HTML 是什么样的?

我真的需要上面的答案来确认,但我的猜测是图像的 URL 是相对的,但是HTML(string=...)WeasyPrint 不知道什么是基本 URL。尝试这样的事情。(我不确定 Django 的详细信息。)

HTML(string=html, base_url=request.build_absolute_uri()).write_pdf(response)

这将在您的应用程序上发出真正的 HTTP 请求,这可能会在单线程服务器上死锁。(我认为开发服务器默认为单线程。)

为了避免这种情况和通过网络的成本,您可能需要考虑编写一个自定义的“URL fetcher”。它可以是任何地方,从专门的图像到仅这一个图像,再到与Flask-WeasyPrint等效的完整 Django 。

于 2013-10-04T05:54:10.730 回答
2

这是一个 URL fetcher,它在本地读取(图像)文件,而不执行 HTTP 请求:

from weasyprint import HTML, CSS, default_url_fetcher
import mimetypes

def weasyprint_local_fetcher(url):
    if url.startswith('local://'):
        filepath = url[8:]
        with open(filepath, 'rb') as f:
            file_data = f.read()
        return {
            'string': file_data,
            'mime_type': mimetypes.guess_type(filepath)[0],
        }
    return default_url_fetcher(url)

为了使用它,请local://在您的 URL 中使用该方案,例如:

<img src="local://myapp/static/images/image.svg" />

然后,将 fetcher 传递给HTML __init__方法:

html = HTML(
    string=html_string,
    url_fetcher=weasyprint_local_fetcher,
)
于 2021-10-29T13:55:58.410 回答