经过进一步调查,我意识到使用 svg 图像根本不应该发生此错误。这是 weasyprint 源代码的相关部分:
if mime_type == 'image/svg+xml':
# No fallback for XML-based mimetypes as defined by MIME
# Sniffing Standard, see https://mimesniff.spec.whatwg.org/
image = SVGImage(string, url)
else:
# Try to rely on given mimetype
try:
if mime_type == 'image/png':
try:
surface = cairocffi.ImageSurface.create_from_png(
BytesIO(string))
except Exception as exception:
raise ImageLoadingError.from_exception(exception)
else:
image = RasterImage(surface)
else:
image = None
except ImageLoadingError:
image = None
# Relying on mimetype didn't work, give the image to GDK-Pixbuf
if not image:
if pixbuf is None:
raise ImageLoadingError(
'Could not load GDK-Pixbuf. PNG and SVG are '
'the only image formats available.')
如您所见,如果它是具有正确 mime 类型 pixbuf 的 png 或 svg,则根本不使用。读完这篇文章后,我意识到这一定是 svg 本身的问题。在我的例子中,图像服务器 S3 为 svg 提供了错误的 content_type。
修复此问题后,错误不再发生,我可以使用 weasyprint 打印 SVG。