2012-04-01 135 views
4

我在* nix-like系統(OS X 10.6.8,各種風格的Linux)上從Gearman PHP進程運行inkscape,將SVG圖像轉換爲PNG或PDF格式。我用的是這樣的(添加這裏只是爲了清楚起見,換行符):在沒有X服務器的情況下運行inkscape

/full/path/to/inkscape -z \ 
    --export-png=/path/to/output.png \ 
    --export-width=100 --export-height=100 \ 
    /path/to/input.svg 

它的工作原理,但儘管-z標誌(「不使用X服務器」)我得到這個在我的控制檯輸出(OS X):

Setting Language: .UTF-8 

(process:44699): Gtk-WARNING **: Locale not supported by C library. 
    Using the fallback 'C' locale. 
Xlib: extension "RANDR" missing on display "/tmp/launch-WvcqRh/org.x:0". 

這表明,我認爲Inkscape中加載多個庫比實際需要的,而且它可能會更快,如果它不試圖連接到X服務器。但是,除了使用-z/--without-gui標誌之外,我不確定要嘗試什麼。在我的開發機器上的性能仍然是亞秒(至少對於簡單的SVG文件),但如果可以的話,我想清除它。即使最好的答案只是「抑制錯誤輸出」!

也許如果我關閉或重置一個bash DISPLAY env var?我對X完全不熟悉。

回答

6

是的,如果你想讓你的程序根本找不到X,你可以在unset DISPLAY之前啓動該過程。

您還可以使用Xvfb來爲 「假的」 X服務器:http://en.wikipedia.org/wiki/Xvfb

你可能也想看看這些工具:

他們源代碼是真的是小。

+0

謝謝,我會給'DISPLAY'的事情一去,並會報告回來!如果這樣做不會產生結果,我會嘗試使用Xvfb,但是我會以低的VPS運行這個系統,所以我想盡量減少額外的軟件。 – halfer 2012-04-03 14:24:25

+0

Btw;我已經嘗試過'svg2pdf',當然在我的Mac上,它似乎沒有做好渲染Inkscape SVG文檔的工作 - 來自單個家族的各種字體樣式都被渲染爲默認變體。 (也許我需要在這裏配置一些東西,但是'inkscape'只是讓它發揮作用)。 – halfer 2012-04-03 14:26:12

+0

我已經嘗試過'DISPLAY =''inkscape --export-png = output.png input.svg'並且還有一個bash腳本,用'unset DISPLAY'和'inkscape'命令,既不抑制'Gtk-WARNING 」。像你一樣,我寧願期待那個工作 - b! – halfer 2012-04-06 17:19:37

0

(echo foo.ai --export-plain-svg foo.svg) | DISPLAY= inkscape --shell

+1

嗨,謝謝你。你能解釋一下嗎?我不是專家級的shell用戶,但是我對'echo-'的'--export-plain-svg'參數感到困惑。你的技術的本質是圖像數據通過一個空的'DISPLAY' env var被傳送到'inkscape'命令? – halfer 2014-01-16 01:20:34

1

另一種方式來抑制輸出,同時保留對真正的錯誤作出響應的能力,是從Python中調用Inkscape中。

import subprocess    # May want to use subprocess32 instead 

cmd_list = [ '/full/path/to/inkscape', '-z', 
      '--export-png', '/path/to/output.png', 
      '--export-width', 100, 
      '--export-height', 100, 
      '/path/to/input.svg' ] 

# Invoke the command. Divert output that normally goes to stdout or stderr. 
p = subprocess.Popen(cmd_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

# Below, <out> and <err> are strings or <None>, derived from stdout and stderr. 
out, err = p.communicate()  # Waits for process to terminate 

# Maybe do something with stdout output that is in <out> 
# Maybe do something with stderr output that is in <err> 

if p.returncode: 
    raise Exception('Inkscape error: ' + (err or '?') ) 

在我的Mac OS系統中,這些混沌狀態信息(由原始的海報所描述的)在err結束。此外,對於我跑某項工作,還有的是在out結束了額外的消息:(輸入SVG文件通過339個像素的大小爲339)

Background RRGGBBAA: ffffff00 
Area 0:0:339:339 exported to 100 x 100 pixels (72.4584 dpi) 
Bitmap saved as: /path/to/output.png 

相關問題