在Windows上让CairoSVG运行

9
尝试让这段代码运行起来:
import cairosvg
import os

path = "D:/PyProjects/Bla/Temp"
os.chdir(path)

cairosvg.svg2pdf(url='Pic.svg', write_to='image.pdf')

但是会出现类似于此帖子中的错误:

Traceback (most recent call last):
  File "D:/work/lean_python/pdf/other.py", line 2, in <module>
    import cairosvg
  File "D:\env_python352\lib\site-packages\cairosvg\__init__.py", line 29, in <module>
    from . import surface
  File "D:\env_python352\lib\site-packages\cairosvg\surface.py", line 24, in <module>
    import cairocffi as cairo
  File "D:\env_python352\lib\site-packages\cairocffi\__init__.py", line 46, in <module>
    cairo = dlopen(ffi, 'cairo', 'cairo-2')
  File "D:\env_python352\lib\site-packages\cairocffi\__init__.py", line 43, in dlopen
    raise OSError("dlopen() failed to load a library: %s" % ' / '.join(names))
OSError: dlopen() failed to load a library: cairo / cairo-2

这篇文章提到:

CairoSVG (the python library and bindings) needs Cairo (The C library, part of GTK+) to run. It appears you don't have it an it's headers installed on your system.

我按照这里描述的步骤1-5进行了操作。现在我已经拥有了cairo头文件:

C:\msys64\mingw64\include\cairo

我还安装了另一个源推荐的pycairo:
pip install pycairo-1.15.2-cp36-cp36m-win_amd64.whl

我仍然收到上述错误。有什么想法吗?
6个回答

11
以下解决方法适用于我:
  • 安装cairosvg (python -m pip install cairosvg)
  • 在脚本中运行import cairosvg
  • 如果成功了,您就可以使用了。否则 (OSError: no library called "cairo" was found):
  • 获取libcairo-2.dll的副本
  • 假设路径为C:\path\cairo\dlls\libcairo-2.dll
  • 在脚本顶部添加以下内容 (在 import cairosvg 之前)

import os os.environ['path'] += r';C:\path\cairo\dlls'

  • import cairosvg现在应该会成功并工作。

(假设您正在运行64位版本的Python,否则请使用win32_headless.msi)


3
GIMP也使用libcairo-2.dll,所以对我来说路径是C:\Program Files\GIMP 2\32\bin。谢谢! - DaWe
3
这对我有用!谢谢 =)Inkscape也使用libcairo-2.dll。os.environ['path'] += r';C:\Program Files\Inkscape\bin' - Rodrigo E. Principe

4

我只是不知道如何使用cairosvg。我找到了一种用svglib包将svg转换为png的替代方法。

from svglib.svglib import svg2rlg
from reportlab.graphics import renderPDF, renderPM
import os

path = "D:/Bla/Temp"
os.chdir(path)

drawing = svg2rlg("Pic.svg")
renderPM.drawToFile(drawing, "Pic.png")

6
如果 SVG 具有透明背景,则此方法无效。 - Loc Truong

3

我采用了一种不同的方式,但在过程中发现了一个修复方法,使得cairosvg可以在Windows 11和Python 3.10上工作。即使安装了GTK3 Runtime Win64,dll也无法加载并生成错误。这解决了问题。在import cairosvg之前添加此代码。灵感来源于jcupitt,https://github.com/libvips/pyvips

    import os
    gtkbin = r'C:\Program Files\GTK3-Runtime Win64\bin'
    add_dll_dir = getattr(os, 'add_dll_directory', None)
    if callable(add_dll_dir):
        add_dll_dir(gtkbin)
    else:
        os.environ['PATH'] = os.pathsep.join((gtkbin, os.environ['PATH']))

    import cairosvg
    cairosvg.svg2pdf(url='banana-coloured.svg', write_to='image.pdf')

导入 os os.add_dll_directory(r"C:\Program Files\GTK3-Runtime Win64\bin") - undefined

1
请使用ctypes.util检查libcairo-2.dll的路径。
在我的情况下,它是一个名为Graphviz的旧软件目录。
python
>>> import ctypes.util
>>> path = ctypes.util.find_library('libcairo-2')
>>> print(path)
C:\Program Files (x86)\Graphviz 2.28\bin\libcairo-2.dll

卸载 Graphviz 后。
python
>>> import ctypes.util
>>> path = ctypes.util.find_library('libcairo-2')
>>> print(path)
C:\msys64\mingw64\bin\libcairo-2.dll

1

0
以下方法适用于我: 我在Program Files文件夹中安装了Windows版的GIMP。 我将bin文件夹复制到我的文件夹根目录下的cairo文件夹中,然后在导入Python中的cairo包之前将其添加到路径中。
import os

folder_path = os.path.abspath("./cairo/bin/")

path_env_var = os.environ["PATH"]

if folder_path not in path_env_var:
    os.environ["PATH"] = folder_path + os.pathsep + path_env_var

import cairosvg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接