Заставить cairosvg работать в windows

Попытка заставить этот код работать:

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 ответов

Решение

Я просто не получаю cairosvg на работу. Я нашел альтернативный способ преобразования svg в png с помощью пакета svglib.

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")

Для меня работает следующий обходной путь:

  • установить cairosvg (python -m pip install cairosvg)
  • пробег import cairosvg в сценарии.
  • если он работает, все готово. иначе (OSError: no library called "cairo" was found):
  • получить копию libcairo-2.dll
    • Я сделал это установкой из uniconvertor-2.0rc4-win64_headless.msi https://sk1project.net/uc2/download/
    • тогда ищи где 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)

Я выбрал другой путь, но в процессе обнаружил исправление, которое позволилоcairosvgдля работы на Windows 11 и Python 3.10. Даже при установленной среде выполнения GTK3 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')

Сначала вы можете установить пакет cairocffi, используя встроенный двоичный пакет, а затем установить cairosvg. Это решит проблему.

https://www.lfd.uci.edu/~gohlke/pythonlibs/

Пожалуйста, проверьте путь libcairo-2.dll с ctypes.util,
В моем случае это был каталог старого программного обеспечения под названием 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

У меня сработало следующее: у меня был установлен GIMP для Windows в папке Program Files. Я скопировал папку bin в папку cairo в корне моей папки, а затем добавил ее в путь перед импортом пакета cairo в Python.

      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
Другие вопросы по тегам