SVG to PNG con fonts personalizadas en Python

Estoy usando una solución basada en Cairo / RSVG para rasterizar SVG a PNG. Ya está descrito en StackOverflow en Convertir SVG a PNG en Python . Sin embargo, esta solución no parece funcionar con fonts personalizadas.

He encontrado esta página que describe la incrustación de fonts SVG .

He intentado incluirlos desde SVG externo a través de XLink, como se describe en el ejemplo. He intentado incrustar la fuente directamente en el mismo archivo SVG. Habiendo fallado con eso, he probado la syntax de fonts web CSS. Ninguno de los 3 métodos funciona al renderizar con Cairo (ni funciona en el visor predeterminado de Ubuntu, Eye of GNOME).

He intentado ImageMagick, con exactamente los mismos resultados que Cairo.

Por otro lado, con los 3 métodos de incrustación de fonts, las fonts se representan correctamente en WebKit, ya sea utilizando Google Chrome o webkit2png.py . Sin embargo, si es posible, me gustaría evitar el uso de QT WebKit en el servidor, ya que es una configuración no trivial (incluido xvfb, etc.), y me temo que puede no resultar muy eficiente ni estable.

¿Hay algún método alternativo para representar SVG a PNG desde Python?

He pasado una semana investigando este problema y llegué a la conclusión de que la mejor manera de manejar la renderización / rasterización de SVG en el lado del servidor con fonts personalizadas es instalar esas fonts en el servidor. Las herramientas que probé (rsvg, imagemgick, phantomjs, qtwebkit …) no pudieron manejar fonts web y fonts svg.

Google tiene varios cientos de fonts (y en crecimiento) que se pueden descargar y usar en un servidor.

  • Descargar fonts OTF o TTF
  • Instálalas en el servidor y actualiza la caché de fonts.
  • Reemplace las definiciones de CSS de las fonts externas con nombres de familias de fonts en sus documentos SVG.

Y si también necesita usar esas mismas fonts en una página web, puede enlazar a Google CDN directamente para los archivos WOFF para conservar su propio tiempo de servidor y ancho de banda de red.

Puedes intentar usar inkscape , quizás esto te dé mejores resultados:

inkscape inputfile.svg --export-png=exportfile.png 

Ejecutar esto desde python se describe aquí: Llamar a un comando externo en Python

Con Imagemgick sigo teniendo problemas con la rasterización de svg con las fonts que están instaladas en el servidor y se pueden usar en ciertas operaciones, pero fallan al usar -convert de .svg a .png … Parece que todo tipo de texto se convierte en arial . Creo que puede ser un error con ImageMagick o un cierto formato necesario en el .svg

Un par de cosas para verificar con RSVG:

  • Que los archivos fuente de la fuente estén en su sistema o en la ruta de la fuente del usuario.
  • Los nombres de fonts en el SVG no se citan, incluso si contienen espacios. librsvg asumirá que las citas son parte del nombre de la fuente y no encontrará los archivos de origen.