我正在使用PDFkit和python将html页面转换为pdf。在html中,正文中只有一个图像标记,src指向一个完整的URL,如:
<html>
<body style="margin: 0px;">
<img style="-webkit-user-select: none; cursor: -webkit-zoom-in;" src="https://blah.blah.com" height="768">
</body>
</html>
然而,当我将html转换为pdf时,这样:
pdfkit.from_file(file, 'labels.pdf', configuration=config)
我得到一个带有边框而不是图像的空白页。
为什么pdfkit没有转换图像?
我在某处读到了我们必须提供包括域名在内的完整图片路径。但是我提供的图片网址已经完成了。然后我做错了什么?
答案 0 :(得分:3)
按照@Manish Gupta的建议,我将图像编码为一串Base64数据。在Python中:
import base64
def get_image_file_as_base64_data():
with open(FILEPATH, 'r') as image_file:
return base64.b64encode(image_file.read())
在我的Jinja2模板中(我知道问题不是针对Jinja2的,但这就是我正在使用的):
<img src="data:;base64,{{ get_image_file_as_base64_data() }}">
答案 1 :(得分:2)
我使用文件路径而不是图像src中的文件url,如:
<img src="D:/image/path/pircure.png">
它有效,也许你可以试试。
答案 2 :(得分:0)
这些其他答案对我不起作用,但是我能够从此处和其他来源整理一些答案,找到了解决方案。
我有一个带有标签的jinja模板:
<img src="data:image/png;base64,{{ img_string }}" width="500px">
然后,通过以下功能运行模板,将模板作为base64编码的字符串传递给模板:
def image_file_path_to_base64_string(filepath: str) -> str:
'''
Takes a filepath and converts the image saved there to its base64 encoding,
then decodes that into a string.
'''
with open(filepath, 'rb') as f:
return base64.b64encode(f.read()).decode()
所以最后,忽略了我进行的各种Jinja初始化
# generate html with base64 encoded string of image
html_string = jinja_template.render(
img_string=image_file_path_to_base64_string('path/to/img.png'))
# generate pdf
pdfkit.from_string(html_string, 'html.pdf')
答案 3 :(得分:0)
我喜欢 Adrian Lin 的方法。 不过,我在 Docker 中使用 Django,以下对我来说非常有用:
Python:
from django.template import Context, Template
import pdfkit
template_folder = 'media'
context['media_folder'] = os.path.abspath(template_folder)
template_file = os.path.join(template_folder, 'template.html')
with open( template_file, 'r') as f:
template = Template(f.read())
html_file = template.render(Context(context))
pdfkit.from_string(html, filename)
HTML 模板:
<img src="{{media_folder}}/my_pic.png">