让 cairosvg 在 Windows 中工作

cs0*_*815 6 python gtk cairo pycairo

试图让这段代码工作:

import cairosvg
import os

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

cairosvg.svg2pdf(url='Pic.svg', write_to='image.pdf')
Run Code Online (Sandbox Code Playgroud)

但是遇到类似于这篇文章的错误:

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
Run Code Online (Sandbox Code Playgroud)

帖子提到:

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.
Run Code Online (Sandbox Code Playgroud)

所以我按照此处描述的步骤 1-5 进行操作。我现在有 cairo 头文件:

C:\msys64\mingw64\include\cairo
Run Code Online (Sandbox Code Playgroud)

我还安装了另一个来源推荐的 pycairo:

pip install pycairo-1.15.2-cp36-cp36m-win_amd64.whl
Run Code Online (Sandbox Code Playgroud)

我仍然收到上述错误。有任何想法吗?

jmn*_*ben 8

以下解决方法对我有用:

  • 安装 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
  • 在您的脚本中添加到顶部(导入 cairosvg 之前)

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

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

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

  • GIMP 还使用 libcairo-2.dll,因此对我来说路径是“C:\Program Files\GIMP 2\32\bin”。谢谢! (3认同)
  • 这对我有用!谢谢 =) Inkscape 还使用 libcairo-2.dll。`os.environ['path'] += r';C:\Program Files\Inkscape\bin'` (2认同)

cs0*_*815 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")
Run Code Online (Sandbox Code Playgroud)

  • 如果 svg 有透明背景,这不起作用 (6认同)