我正在使用Python的Weasyprint库来尝试将html文件打印到pdf。我试图将图像嵌入到我的页面背景中。这是代码:
HTML(string='''
<h1>The title</h1>
<p>Content goes here
''', base_url=os.path.dirname(os.path.realpath(__file__))).write_pdf("hello.pdf", stylesheets=[CSS(string='body{background-image: url("example_image.png")}')])
我得到的代码输出如下:
Ignored `background-image: url("example_image.png")` at 1:6, Relative URI reference without a base URI: 'example_image.png'.
blah@blah:~/Dropbox/Terraverde/annual_reports$ python3 test_excel.py
我试图在Stackoverflow中搜索此问题的解决方案,并阅读了文档,但我能找到答案的最接近的帖子是关于相同问题的以下帖子,但对于Django:Django WeasyPrint CSS integration warning: Relative URI reference without a base URI: <link href="/static/css/bootstrap.min.css"> at line None
我也尝试在我的代码中使用document.baseURI:
base_url=os.path.dirname(os.path.realpath(__file__))).write_pdf("hello.pdf", stylesheets=[CSS(string='body{background-image: url(document.baseURI + "example_image.png")}')])
但这仍然产生错误:
Parse error at 1:24, unexpected BAD_URI token in property value
关于如何处理问题的任何建议,或者对于常规Python或Flask,可能是类似于Django request.build_absolute_uri()
的命令?
答案 0 :(得分:3)
我在OSX上使用pystache渲染的模板中出现了与此标记相同的错误:
<img src="/Users/my_username/my_project/my_image.png" />
所以我尝试了这个而且它有效:
<img src="file:///Users/my_username/my_project/my_image.png" />
只需在/ Users / ...路径前添加file://即可。 (请注意,它有3个斜杠)。
答案 1 :(得分:2)
我发现 base_url
必须作为参数提供给 weasyprint.CSS
函数而不是 weasyprint.HTML
函数:
from weasyprint import HTML, CSS
html_content = '''<h1>The title</h1><p>Content goes here'''
base_url = os.path.dirname(os.path.realpath(__file__))
css = CSS(string='body{background-image: url("example_image.png")}', base_url=base_url)
HTML(string=html_content).write_pdf("hello.pdf", stylesheets=[css])
作为奖励,加载位于此脚本旁边的 fonts
文件夹中的本地字体也是如此:
# for debugging
import logging
logger = logging.getLogger('weasyprint')
logger.addHandler(logging.StreamHandler())
import os
from weasyprint import HTML, CSS
from weasyprint.fonts import FontConfiguration
html_content = '''<h1>The title</h1><p>Content goes here</p>'''
font_config = FontConfiguration()
THIS_FILE_DIR = os.path.dirname(os.path.abspath(__file__)) + os.sep
base_url = 'file://' + THIS_FILE_DIR
# fonts downloaded from
# https://fonts.google.com/specimen/Poppins?preview.text_type=custom&sidebar.open=true&selection.family=Poppins:wght@400;500;600;700
css = CSS(string='''
@font-face {
font-family: 'Poppins';
src: url('./fonts/Poppins-Regular.ttf') format('truetype');
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: 'Poppins';
src: url('./fonts/Poppins-Medium.ttf') format('truetype');
font-weight: 500;
font-style: normal;
}
@font-face {
font-family: 'Poppins';
src: url('./fonts/Poppins-SemiBold.ttf') format('truetype');
font-weight: 600;
font-style: normal;
}
@font-face {
font-family: 'Poppins';
src: url('../base/fonts/Poppins-Bold.ttf') format('truetype');
font-weight: 700;
font-style: normal;
}
''', font_config=font_config, base_url=base_url)
HTML(string=html_content).write_pdf("hello.pdf", stylesheets=[css])