get cairosvg working in windows

Question:

Trying to get this code working:

import cairosvg
import os

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

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

but get errors along similar to this post:

Traceback (most recent call last):
  File "D:/work/lean_python/pdf/other.py", line 2, in <module>
    import cairosvg
  File "D:env_python352libsite-packagescairosvg__init__.py", line 29, in <module>
    from . import surface
  File "D:env_python352libsite-packagescairosvgsurface.py", line 24, in <module>
    import cairocffi as cairo
  File "D:env_python352libsite-packagescairocffi__init__.py", line 46, in <module>
    cairo = dlopen(ffi, 'cairo', 'cairo-2')
  File "D:env_python352libsite-packagescairocffi__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

The post mentions:

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.

So I followed step 1 – 5 described here. I now have cairo header files in:

C:msys64mingw64includecairo

I also installed pycairo recommended by another source:

pip install pycairo-1.15.2-cp36-cp36m-win_amd64.whl

I still get the above errors. Any ideas?

Asked By: cs0815

||

Answers:

I just do not get cairosvg to work. I found an alternative way to transform an svg into a png using the svglib package.

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")
Answered By: cs0815

Please check the path of libcairo-2.dll with the ctypes.util.
In my case, It was a directory of old software called Graphviz.

python
>>> import ctypes.util
>>> path = ctypes.util.find_library('libcairo-2')
>>> print(path)
C:Program Files (x86)Graphviz 2.28binlibcairo-2.dll

After uninstalling Graphviz.

python
>>> import ctypes.util
>>> path = ctypes.util.find_library('libcairo-2')
>>> print(path)
C:msys64mingw64binlibcairo-2.dll
Answered By: taront

The following workaround works for me:

  • install cairosvg (python -m pip install cairosvg)
  • run import cairosvg in a script.
  • if it works, you’re set. otherwise (OSError: no library called "cairo" was found):
  • get a copy of libcairo-2.dll
  • say the path is C:pathcairodllslibcairo-2.dll
  • in your script add to the top (before import cairosvg)


import os
os.environ['path'] += r';C:pathcairodlls'

  • import cairosvg should now succeed and work.

(Assumes you are running 64bit version of Python, otherwise use win32_headless.msi)

Answered By: moltenform

You can first install cairocffi package first using a built binary package, then install cairosvg. That will resolve the problem.

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

Answered By: KevinKSY

I adopted a different way but discovered in the process a fix that allowed cairosvg to work on Windows 11 and Python 3.10. Even with the GTK3 Runtime Win64 installed the dll could not be loaded and generated an error. This resolved the issue. Add this code before import cairosvg. Source of idea was jcupitt, https://github.com/libvips/pyvips:

    import os
    gtkbin = r'C:Program FilesGTK3-Runtime Win64bin'
    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')
Answered By: Sildeag

The following worked for me:
I had GIMP for Windows installed in my Program Files folder.
I copied the bin folder in to cairo folder in the root of my folder and then added it to path before importing the cairo package in 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
Answered By: Nikita Lukianets
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.