如何在 weasyprint 中使用自定义字体
How to use custom font with weasyprint
我有一个 Django 应用程序,我想从我的 Django 视图创建一个 PDF。
我使用 weasyprint,但出于某种原因它不接受我的自定义字体。
字体 url 正常工作,当我使用相同的字体呈现相同的 html 时,我看到了正确的字体,但我的 pdf 呈现的是错误的字体。我也试过 base64 字体字符串,但没有成功。我的渲染代码是:
import os
from weasyprint import HTML, CSS
from weasyprint.fonts import FontConfiguration
from django.conf import settings
from django.http import HttpResponse
from django.template.loader import get_template
from django.urls import reverse
def render_to_pdf(template_src, context_dict={}):
font_config = FontConfiguration()
font_string = '''
@font-face {
font-family: 'Titillium Web';
font-style: normal;
font-weight: 300;
src: local('Titillium Web Light'), local('TitilliumWeb-Light'), url('http://X.X.X.X:8000/static/fonts/titillium_web.woff2') format('woff2');
}
*, div {font-family: 'Titillium Web';}
'''
template = get_template(template_src)
rendered_html = template.render(context_dict)
pdf_file = HTML(string=rendered_html).write_pdf(stylesheets=[
CSS(settings.BASE_DIR + '/gui/executive_summary.css'),
CSS(string=font_string)],font_config=font_config)
response = HttpResponse(pdf_file, content_type='application/pdf')
response['Content-Disposition'] = 'filename="report.pdf"'
return response
知道我做错了什么吗?
如您在文档中所见:
WeasyPrint should support any font format handled by FreeType (any
format widely used except WOFF2)
SRC:http://weasyprint.readthedocs.io/en/latest/features.html#fonts
如果您的 CSS 中有 @font-face
条规则,您必须创建一个
FontConfiguration
对象:
fromweasyprintimport HTML, CSS
from weasyprint.fonts import FontConfiguration
font_config = FontConfiguration()
html = HTML(string='<h1>The title</h1>')
css = CSS(string='''
@font-face {
font-family: Gentium;
src: url(http://example.com/fonts/Gentium.otf);
}
h1 { font-family: Gentium }''', font_config=font_config)
html.write_pdf(
'/tmp/example.pdf', stylesheets=[stylesheet],
font_config=font_config)
https://weasyprint.readthedocs.io/en/stable/tutorial.html?highlight=FontConfiguration
有两种方法
1) 在线上传字体,将link粘贴到url中。
例如:@font-face {
font-family: Gentium;
src: url(http://example.com/fonts/Gentium.otf);
}
2) 如果你想使用本地目录中的字体。
例如:@font-face{
font-family: Gothan Narrow;
src: url(file:///home/javed/Downloads/fonts/GothamNarrow-Light.otf)
}
我有一个 Django 应用程序,我想从我的 Django 视图创建一个 PDF。 我使用 weasyprint,但出于某种原因它不接受我的自定义字体。 字体 url 正常工作,当我使用相同的字体呈现相同的 html 时,我看到了正确的字体,但我的 pdf 呈现的是错误的字体。我也试过 base64 字体字符串,但没有成功。我的渲染代码是:
import os
from weasyprint import HTML, CSS
from weasyprint.fonts import FontConfiguration
from django.conf import settings
from django.http import HttpResponse
from django.template.loader import get_template
from django.urls import reverse
def render_to_pdf(template_src, context_dict={}):
font_config = FontConfiguration()
font_string = '''
@font-face {
font-family: 'Titillium Web';
font-style: normal;
font-weight: 300;
src: local('Titillium Web Light'), local('TitilliumWeb-Light'), url('http://X.X.X.X:8000/static/fonts/titillium_web.woff2') format('woff2');
}
*, div {font-family: 'Titillium Web';}
'''
template = get_template(template_src)
rendered_html = template.render(context_dict)
pdf_file = HTML(string=rendered_html).write_pdf(stylesheets=[
CSS(settings.BASE_DIR + '/gui/executive_summary.css'),
CSS(string=font_string)],font_config=font_config)
response = HttpResponse(pdf_file, content_type='application/pdf')
response['Content-Disposition'] = 'filename="report.pdf"'
return response
知道我做错了什么吗?
如您在文档中所见:
WeasyPrint should support any font format handled by FreeType (any format widely used except WOFF2)
SRC:http://weasyprint.readthedocs.io/en/latest/features.html#fonts
如果您的 CSS 中有 @font-face
条规则,您必须创建一个
FontConfiguration
对象:
fromweasyprintimport HTML, CSS
from weasyprint.fonts import FontConfiguration
font_config = FontConfiguration()
html = HTML(string='<h1>The title</h1>')
css = CSS(string='''
@font-face {
font-family: Gentium;
src: url(http://example.com/fonts/Gentium.otf);
}
h1 { font-family: Gentium }''', font_config=font_config)
html.write_pdf(
'/tmp/example.pdf', stylesheets=[stylesheet],
font_config=font_config)
https://weasyprint.readthedocs.io/en/stable/tutorial.html?highlight=FontConfiguration
有两种方法
1) 在线上传字体,将link粘贴到url中。
例如:@font-face {
font-family: Gentium;
src: url(http://example.com/fonts/Gentium.otf);
}
2) 如果你想使用本地目录中的字体。
例如:@font-face{
font-family: Gothan Narrow;
src: url(file:///home/javed/Downloads/fonts/GothamNarrow-Light.otf)
}