使用ImageMagick将带有自定义字体的SVG转换为PNG

使用ImageMagick将带有自定义字体的SVG转换为PNG,svg,imagemagick,Svg,Imagemagick,我正在使用ImageMagick将SVG转换为PNG,所有这些都非常有效,直到我尝试使用@font-face添加自定义字体,然后在SVG文件中添加。在蜡染上效果很好,但现在在ImageMagick上我就是无法让它发挥作用 我可以将字体更改为“convert-list font”中列出的字体,但我可能必须经常更改字体,因此我想以某种方式指向转换时的字体文件,而不是使用字体或其他解决方案 SVG文件还可以包含多个字体系列,my ImageMagick安装包括rsvg委托 有什么想法吗?谢谢 Inks

我正在使用ImageMagick将SVG转换为PNG,所有这些都非常有效,直到我尝试使用@font-face添加自定义字体,然后在SVG文件中添加。在蜡染上效果很好,但现在在ImageMagick上我就是无法让它发挥作用

我可以将字体更改为“convert-list font”中列出的字体,但我可能必须经常更改字体,因此我想以某种方式指向转换时的字体文件,而不是使用字体或其他解决方案

SVG文件还可以包含多个字体系列,my ImageMagick安装包括rsvg委托


有什么想法吗?谢谢

Inkscape可以从命令行运行。它有大量的转换选项(请参见
maninkscape
),通过--verb和--select选项,甚至可以执行GUI中的操作

正如哈弗所指出的,它的转换速度也相当快。但是请注意,它的渲染器是为交互式显示而设计的,而不是rsvg那样的单通道静态显示,因此rsvg在某些情况下可能会更快。此外,在web服务器上安装Inkscape有时可能会出现问题,这仅仅是因为该GUI应用程序具有大量依赖关系

当我们将这些命令行选项添加到Inkscape时,部分原因是rsvg缺乏对许多SVG特性的支持,包括字体面。从那时起,rsvg得到了改进,我认为它现在应该支持通过font face属性替换字体。最常见的问题是字体安装在rsvg看不到的地方(可能专有字体保存在发行版中的不同路径?)


祝你好运,如果你能解决它,请告诉我们。

试试
librsvg2
软件包提供的
rsvgconvert
(一个命令行程序)

我在AmazonLinux上(但在我的Ubuntu桌面上)的ImageMagick也有同样的问题。
我认为ImageMagick的SVG处理相当糟糕。它无法正确识别“display:none”样式属性。

我曾经有一堆SVG文件,每个文件一页(一整本书)。字体是自动生成的,每页一种。字符编码是非标准的,我相信只有页面中实际使用的字符才会被放入字体中。即使字体是使用数据URI嵌入到SVG中的,但我使用的程序(Imagemagick、Inkscape、rsvg convert)都无法显示它们。只有Firefox能够正确呈现页面。以下是我所做的:

首先,我创建了一个包含所有页面的简单HTML:

<html>
    <body>
         <img src="p001.svg" />
         <img src="p002.svg" />

然后,我在Firefox中打开了HTML。这花了一些时间,但却把整本书都呈现出来了

然后,我将整个页面打印为PDF格式。我首先将打印选项设置为不打印页眉/页脚

结果是一个数兆字节的大型PDF(其中还包含光栅图像)

这不是最简单的解决方案,但它奏效了。遗憾的是,其他SVG渲染器都不如Firefox中的好


希望这对其他人有所帮助。

在要求将html渲染为图像后,我得到了这个答案,但它也适用于SVG:


生成一个<代码>屏幕截图。PNG 文件根据谷歌浏览器将呈现的内容。

如果你不能获得IMAGEMGEK工作,请考虑用<代码> IKSCAPE < /COD>进行转换,也可以在命令行中调用。我不知道它对@font-face的支持是什么样的,但我想知道你是否对此进行了研究。我使用ImageMagick完成了所有SVG->PNG,除了字体之外,其他功能都很好。我将尝试使用type.xml安装它们,但我不希望这样。尽管如此,工作的Inkscape比部分工作的ImageMagick要好。考虑到在CLI上启动转换是多么容易,这不值得一试吗?是的,但我在使用Batik之前就已经让它工作了,但因为我是从PHP运行它,所以我更喜欢从PHP使用的解决方案。Batik使用system()完成了这项工作,但速度非常慢。稍后我将试一试Inkscape,看看它是如何工作的,到目前为止ImageMagick的速度给我留下了非常深刻的印象。对于相当复杂的文档,我在开发人员笔记本电脑上的转换时间约为0.7秒——当然,一如既往,这是一个“一段字符串有多长”的案例,并且高度依赖于服务器。但再加上队列系统(在我的例子中是Gearman),我认为这将是一个非常有效的解决方案。我从Illustrator导出了一个SVG,rsvg convert无法正确呈现字体,直到我从Illustrator导出SVG,并使用fontType=SVGFontType.OUTLINEFONT(通过JS API;可能也存在于GUI中)。
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless --screenshot --window-size=256,256 --default-background-color=0 image.svg