使用 Weasyprint 的 PDF 输出不显示图像(Django)
PDF output using Weasyprint not showing images (Django)
我正在尝试使用 Weasyprint 库在 Django 上输出 PDF,但图像没有出现在生成的 PDF 中。我已经为图像尝试了相对和静态 URLs,但即使是静态 URL 也不显示图像。在 chrome 上打开 HTML 本身时,图像会显示。
这是我在 views.py 文件中的 pdf 生成视图:
def pdf_generation(request, some_slug)
stud = Student.objects.get(some_slug=some_slug)
studid = stud.some_slug
context = {'studid':studid}
html_string = render_to_string('templates/pdf_gen.html', context)
html = HTML(string=html_string)
pdf = html.write_pdf(stylesheets=[CSS(settings.STATIC_ROOT + '/css/detail_pdf_gen.css')]);
response = HttpResponse(pdf, content_type='application/pdf')
response['Content-Disposition'] = 'inline; filename="mypdf.pdf"'
return response
这里是图片的HTML部分:
<DIV id="p1dimg1">
<IMG src="{% static 'img/image.jpg' %}" alt="">
</DIV>
和 CSS:
#page_1 #p1dimg1 {position:absolute;top:0px;left:0px;z-
index:-1;width:792px;height:1111px;}
#page_1 #p1dimg1 #p1img1 {width:792px;height:1111px;}
非常感谢
我不知道 Weasyprint,但我正在使用 Pisa,它非常适合将图片转换为 PDF 输出。
例如:
def PDFGeneration(request) :
var1 = Table1.objects.last()
var2 = Table2.objects.last()
data = {"key1" : variable1, "key2" : variable2}
html = get_template('My_template_raw.html').render(data)
result = StringIO()
with open(path, "w+b") as file :
pdf = pisa.pisaDocument(StringIO(html), file, link_callback=link_callback)
file.close()
image_data = open(path, "rb").read()
return HttpResponse(image_data, content_type="application/pdf")
return render(request, 'HTML template', context)
和
def link_callback(uri, rel):
if uri.find('chart.apis.google.com') != -1:
return uri
return os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, ""))
我的 PDF 是从 .html 文件生成的,我的图片是这样的:
<html>
<head>
{% load staticfiles %}
{% load static %}
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="{% static 'css/MyFile.css' %}"/>
<style>
body {
font-family: Courier New, Courier, monospace;
text-align: justify;
list-style-type: none;
}
</style>
</head>
<body>
<img src="{{MEDIA_ROOT}}Logo/logo.jpeg" width="250" height="66"/>
<br></br>
...
修复者:
添加base_url=request.build_absolute_uri()
以便
html = HTML(string=html_string)
变成
html = HTML(string=html_string, base_url=request.build_absolute_uri())
这将允许 HTML 文件中的相对 URL。
对于图像,出于某种原因似乎只有 PNG 图像有效。
要在 PDF 上显示 HTML 样式,请根据 Weasyprint 文档添加 presentational_hints=True:
pdf = html.write_pdf(stylesheets=[CSS(settings.STATIC_ROOT + '/css/detail_pdf_gen.css')], presentational_hints=True);
为您的图像路径设置静态:
{% load static %}
<img src="{% static 'images/your_image.png %}" alt="" />
然后你必须将Weasyprint的HTML class中的base_url传递为:
HTML(string=html_string, base_url=request.build_absolute_uri())
在我的配置中添加 HTML(string=html_string, base_url=request.build_absolute_uri())
后图像仍然没有加载。必须使用以下日志记录来确定真正的问题。
import logging
logger = logging.getLogger('weasyprint')
logger.addHandler(logging.FileHandler('/tmp/weasyprint.log'))
然后检查 /tmp/weasyprint.log
日志文件是否有错误。
对我来说真正的问题是:
urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate
修复是禁用 ssl 验证:
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
我遇到了这个问题。我在下一行添加了“base_url='base_url'”,它终于起作用了。
html = weasyprint.HTML(字符串=rendered_string, base_url='base_url')
附上我的上下文代码图片。
我正在尝试使用 Weasyprint 库在 Django 上输出 PDF,但图像没有出现在生成的 PDF 中。我已经为图像尝试了相对和静态 URLs,但即使是静态 URL 也不显示图像。在 chrome 上打开 HTML 本身时,图像会显示。
这是我在 views.py 文件中的 pdf 生成视图:
def pdf_generation(request, some_slug)
stud = Student.objects.get(some_slug=some_slug)
studid = stud.some_slug
context = {'studid':studid}
html_string = render_to_string('templates/pdf_gen.html', context)
html = HTML(string=html_string)
pdf = html.write_pdf(stylesheets=[CSS(settings.STATIC_ROOT + '/css/detail_pdf_gen.css')]);
response = HttpResponse(pdf, content_type='application/pdf')
response['Content-Disposition'] = 'inline; filename="mypdf.pdf"'
return response
这里是图片的HTML部分:
<DIV id="p1dimg1">
<IMG src="{% static 'img/image.jpg' %}" alt="">
</DIV>
和 CSS:
#page_1 #p1dimg1 {position:absolute;top:0px;left:0px;z-
index:-1;width:792px;height:1111px;}
#page_1 #p1dimg1 #p1img1 {width:792px;height:1111px;}
非常感谢
我不知道 Weasyprint,但我正在使用 Pisa,它非常适合将图片转换为 PDF 输出。
例如:
def PDFGeneration(request) :
var1 = Table1.objects.last()
var2 = Table2.objects.last()
data = {"key1" : variable1, "key2" : variable2}
html = get_template('My_template_raw.html').render(data)
result = StringIO()
with open(path, "w+b") as file :
pdf = pisa.pisaDocument(StringIO(html), file, link_callback=link_callback)
file.close()
image_data = open(path, "rb").read()
return HttpResponse(image_data, content_type="application/pdf")
return render(request, 'HTML template', context)
和
def link_callback(uri, rel):
if uri.find('chart.apis.google.com') != -1:
return uri
return os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, ""))
我的 PDF 是从 .html 文件生成的,我的图片是这样的:
<html>
<head>
{% load staticfiles %}
{% load static %}
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="{% static 'css/MyFile.css' %}"/>
<style>
body {
font-family: Courier New, Courier, monospace;
text-align: justify;
list-style-type: none;
}
</style>
</head>
<body>
<img src="{{MEDIA_ROOT}}Logo/logo.jpeg" width="250" height="66"/>
<br></br>
...
修复者:
添加base_url=request.build_absolute_uri()
以便
html = HTML(string=html_string)
变成
html = HTML(string=html_string, base_url=request.build_absolute_uri())
这将允许 HTML 文件中的相对 URL。
对于图像,出于某种原因似乎只有 PNG 图像有效。
要在 PDF 上显示 HTML 样式,请根据 Weasyprint 文档添加 presentational_hints=True:
pdf = html.write_pdf(stylesheets=[CSS(settings.STATIC_ROOT + '/css/detail_pdf_gen.css')], presentational_hints=True);
为您的图像路径设置静态:
{% load static %}
<img src="{% static 'images/your_image.png %}" alt="" />
然后你必须将Weasyprint的HTML class中的base_url传递为:
HTML(string=html_string, base_url=request.build_absolute_uri())
在我的配置中添加 HTML(string=html_string, base_url=request.build_absolute_uri())
后图像仍然没有加载。必须使用以下日志记录来确定真正的问题。
import logging
logger = logging.getLogger('weasyprint')
logger.addHandler(logging.FileHandler('/tmp/weasyprint.log'))
然后检查 /tmp/weasyprint.log
日志文件是否有错误。
对我来说真正的问题是:
urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate
修复是禁用 ssl 验证:
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
我遇到了这个问题。我在下一行添加了“base_url='base_url'”,它终于起作用了。
html = weasyprint.HTML(字符串=rendered_string, base_url='base_url')
附上我的上下文代码图片。