我有多个SVG,其中一些相当大(11MB),并且使用pdf2svg从PDF创建。
问题是,SVG太大,需要很长时间才能打开,并且不必要地复杂。它主要包含文本和一些图像(想想报纸),文本被分成小块的字符,甚至不包括文字。
我需要优化它,首先要减小尺寸,还要减少元素数量,以加快加载速度。到目前为止,我唯一想到的就是查看一行中的字符,并将它们加入一个<tspan>
。
这应该会大幅减少文本元素的数量,因为它看起来主要是1-5个字母的组。
但是我正在寻找一些我可以对SVG做的事情以减小尺寸。还有一个主字体,用于约95%的文本,但就像现在一样,所有文本都被定义为字形(渲染形状)。
是否可以嵌入字体,因此文字会呈现为文字,而不是形状?
此外,如果您知道有任何更好的库将PDF转换为SVG,我会感激任何输入。唯一的要求是SVG输出应该与PDF完全相同。
我还要注意速度并不重要。转换所需的时间并不重要,只要它产生所需的结果即可。
答案 0 :(得分:27)
SVG-Cleaner似乎运行得非常好:比其他人快得多,压缩效果更好,我的测试更健壮,批处理文件夹处理,嘿!我们懒人的Windows安装程序!
我的尝试:原始文件大小:241 KB,在InkScape删除引用后:149K,使用工具清理:38 KB,清理和压缩:5 KB(.sgvz文件扩展名)。
我试图打开最后一张,期待一张空白的图画...但我的图片仍然完好无损!
下载here(Windows,Ubuntu或源代码)
答案 1 :(得分:22)
我最近开始制作一个Python程序来优化SVG,您可以在以下网址找到它:https://github.com/petercollingridge/SVG-Optimiser
有一个非常初步的在线版本: http://petercollingridge.appspot.com/
了解更多信息: http://www.petercollingridge.co.uk/blog/svg-optimiser
它远非完整且可能非常多,但它处理Chasbeen提到的一些问题,例如删除不必要的精度和默认样式属性。如果您知道要查找的内容,它还可以删除不必要的属性和名称空间,并将样式转换为CSS,这样可以更容易地看到它们的改进方式。
我真的不明白你对嵌入字体的意思。如果你粘贴一个SVG的示例片段来显示gyphs和多个字符元素,我可能会包含一个方法来组合它们。
答案 2 :(得分:22)
我可以推荐 Scour ,因为我在清除SVG文件中不必要的错误时自己经常使用它,这是我的一个爱好。
一个示例scour命令行,它可能很好地为你服务(我倾向于从中开始):
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中收集了大量的交易技巧,这对于这类事物来说就是一种综合的学习和教学场所。 / p>
是的,您可以在SVG文件中嵌入字体,或链接外部字体,如Mike Bostock对WebPlatform.org logo(non-html-wrapped version here)的描述所示。
如果你对所使用的字体有详细的了解,那么当你选择一个任意的pdf并进行转换时,这当然要容易得多。我不知道有任何工具可以从原始pdf嵌入的任何字形创建无名字体而不用你自己做大部分(或全部)工作。
此外,Kilobyte SVG Challenge README的工具部分中有越来越多的SVG优化工具。
答案 3 :(得分:7)
sudo npm install -g svgo
优化当前目录中的所有svgs:
svgo -f .
如果您没有npm,可以像以下一样在Ubuntu上安装:
sudo apt-get update && sudo apt-get install nodejs-legacy npm
答案 4 :(得分:2)
我认为你转换的SVG可能非常臃肿。我不确定Inkscape是否会接受它! 有一些菜单选项,如“转换为文本”,但这些选项不一定有效。
您可以对文件进行搜索和替换,以删除对默认SVG属性值的引用,例如.. 行程:#000000; 笔划宽度:1px的; 冲程的linecap:对接; 冲程linejoin:斜切; 行程不透明度:1; 其中很多都是默认的,所以搜索并替换为那些没有。
同样令人惊讶的是如何减少不必要的精确度。在您转换该特定文件时,您可能会发现小数结尾.0000001或.99999675所有这些重复也可以删除/缩小
答案 5 :(得分:0)
使用包含SVG sanitization的python库feedparser
,我编写了这个函数,它将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的大小。
答案 6 :(得分:0)
可能你可以使用免费的Web服务。