2012-01-25 49 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大小一個公平的位。