pdfkit不将图像转换为pdf

时间:2016-07-12 13:11:04

标签: python pdfkit

我正在使用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没有转换图像?

我在某处读到了我们必须提供包括域名在内的完整图片路径。但是我提供的图片网址已经完成了。然后我做错了什么?

4 个答案:

答案 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">