2012-01-25 50 views
49

我有多个SVG,其中一些相当大(11MB),它们是使用pdf2svg从PDF创建的。优化SVG有哪些选择?

问题是,SVG太大,需要很长时间才能打开,而且不必要的复杂。它主要包含文本和一些图像(认为是报纸),文本被分成几个小块,甚至不是单词。

我需要对其进行优化,首先要减小尺寸,并且要减少元素的数量以使其加载更快。我到目前为止唯一想到的就是查看一行中的字符,并将它们加入到一个单独的<tspan>中。

这应该会减少文本元素的数量相当大的幅度,因为它看起来像是大多数1-5个字母的组。

但是我正在寻找更多的东西,我可以做的SVG缩小尺寸。还有一个主要的字体,用于大约95%的文本,但是现在,所有的文本都被定义为字形(呈现的形状)。

是否有可能只是嵌入字体,所以文本呈现为文本,而不是形状?

此外,如果你知道任何更好的库转换PDF格式为SVG,我会很感激任何输入。唯一的要求是它的SVG输出看起来应该和PDF完全一样。

我还想指出速度并不重要。无论转换需要多长时间,只要它能产生所需的结果。

+1

听起来像你真正想要的是HTML。如果通过将文本字形更改为使用嵌入字体的文本来优化SVG,并优化剩余的形状和图像以使它们的文件尺寸更小,则最终会使用HTML。 –

回答

2

我认为你的转换后的SVG很可能是非常臃肿的。我不确定Inkscape是否会接受它! 有菜单选项,如“转换为文本”,但这些不一定工作。

您可以搜索并替换您的文件以删除对默认SVG属性值的引用,例如.. stroke:#000000; stroke-width:1px; stroke-linecap:butt; stroke-linecap:butt; stroke-linejoin:miter; 笔画不透明度:1; 很多这些都是默认情况下,所以搜索和替换没有为这些。

此外,它是惊人的,你可以减少不必要的精度。在您对该特定文件的转换中,您可能会发现以小数为结尾.0000001或.99999675所有这些重复也可以被删除/减少

22

我最近开始制作一个Python程序来优化SVG,您可以找到在:https://github.com/petercollingridge/SVG-Optimiser

有一个非常初步的在线版本: http://petercollingridge.appspot.com/

与信息 http://www.petercollingridge.co.uk/blog/svg-optimiser

这是远远没有完成,可能非常马车,但它处理Chasbeen提到的一些问题,例如删除不必要的精度和默认样式属性。如果你知道你在找什么,它也可以去掉不必要的属性和名称空间,并且会将样式转换为CSS,这样可以更容易地看到它们如何被改进。

我真的不明白你的意思是关于嵌入字体。如果您粘贴SVG的示例片段来显示gyph和多个字符元素,我可能会包含一个方法来组合它们。

+0

我刚刚测试过你的工具,它的工作非常好。谢谢;-) –

+1

谢谢!很高兴知道它有一些用处。 –

20

我可以推荐Scour因为我在清理SVG文件中不必要的文件时使用了很多,这对我来说是一种爱好。

一个例子冲刷命令行可能为你服务好(和我倾向于从开始):

scour --enable-viewboxing --create-groups --shorten-ids --enable-id-stripping --enable-comment-stripping --disable-embed-rasters --remove-metadata --strip-xml-prolog -p 9 <old.svg> new.svg 

一定要比较老带新,以确保它没有破坏任何东西,尝试降低-p十进制精度(如果不给定,则默认值为5);在某种程度上,它可能开始扭曲的事情相当糟糕,但一到两位小数应该看起来不错。

如果你想采取更手动的方法,Kilobyte SVG Challenge changesets中有很多关于交易的技巧,这些技巧意味着这种类型的组合学习和教学场所。

是的,您可以在SVG文件中嵌入字体,或链接外部字体,如Mike Bostock在WebPlatform.org logonon-html-wrapped version here)上所示。

如果您对使用什么字体有详细的了解,比选择任意pdf并将其转换时更容易;我不知道有哪些工具可以从原始PDF中嵌入的任何字形创建无名字体,而无需您自己完成大部分(或全部)工作。

此外,在Kilobyte SVG Challenge README的工具部分中还有越来越多的SVG优化工具。

+1

现在,冲刷是我的第一选择。输出是完美的和轻的。 –

+0

我刚试过。它运作良好。 'scour -i mat1.svg -o mat1_clean2.svg',它并没有像svgcleaner那样去除图像中的标题。 – Nasser

+0

在OpenBSD上:'pkg_add scour'。好,快速的解决方案。 –

26

SVG清洁工似乎工作完美:比其他人更快,更好的压缩,强大的测试,批处理文件夹处理,嘿!一个为我们安装windows的懒人!我的尝试:原始文件大小:241 KB,在InkScape删除参考:149K后,使用工具清理:38 KB,清理并压缩:5 KB(.sgvz文件扩展名)。

我试图打开最后一个,期待一个空白的绘图......但我的图形仍然完好无损!

下载它here(在Windows,Ubuntu的,或来源)

+2

Windows下载链接不起作用(至少目前)。 Windows版本可以下载[这里](http://sourceforge.net/projects/svgcleaner/) – snumpy

+0

svg-clean不能正常工作。当我清理svg文件时,它删除了我图像的所有标题,即使使用'preset = basic'。 – Nasser

+0

有没有办法让SVGCleaner从'stdin'读取并写入'stdout'而不是文件?我试着指定'/ dev/stdin'和'/ dev/stdout'作为输入和输出文件,但是失败了。 – Ponkadoodle

7

https://github.com/svg/svgo

sudo npm install -g svgo 

优化所有svgs当前目录:

svgo -f . 

如果你没有NPM ,你可以像这样在Ubuntu上安装它:

sudo apt-get update && sudo apt-get install nodejs-legacy npm 
+2

对Inkscape 0.48创建的SVG 1.1不太好。 SVGO输出凌乱的形状,无法使用它。 –

+0

SVGO是一款优化SVG的CLI工具。顺便说一下,对于外行来说,SVG已经是一个非常高性能和轻量级的图像格式。您可能会因为优化光栅图像而付出更多努力。 –

0

使用Python库feedparser,其中包括SVG sanitization,我写了这个函数,它烦人地将svg包装在一个RSS项目中,以便解析它。

import feedparser 
def sanitize_svg(svg): 
    feed = """<?xml version="1.0" encoding="UTF-8" ?><rss><channel><item><description>""" + svg + """</description></item></channel></rss>""" 
    parsed = feedparser.parse(feed) 
    return parsed.entries[0].description.encode('utf-8') 

尽管为白名单安全考虑的元素,它也减少了svg大小一个公平的位。