2013-07-10 53 views
0

我有下面的GhostScript命令,我打算將輸入pdf轉換爲一組輸出PNG圖像(每頁一個圖像):Ghostscript在嘗試轉換爲PNG時打印出一串編碼的字符

"C:\Program Files\gs\gs9.07\bin\gswin64c.exe" \ 
    -dNOPAUSE \ 
    -q \ 
    -r150 \ 
    -sDEVICE=png16m \ 
    -dBATCH \ 
    -c "30000000 setvmthreshold" \ 
    -dNumRenderingThreads=8 \ 
    -sOutputFile="C:\output-%d.png" \ 
    "C:\input.pdf" 

當我在Windows命令提示符下運行此命令時,它突然打印出一大堆來自默認打印機的編碼字符的紙張。它不會產生任何種類的PNG圖像。

UPDATE 省略-q給出:

GPL Ghostscript 9.07 (2013-02-14) 
Copyright (C) 2012 Artifex Software, Inc. All rights reserved. 
This software comes with NO WARRANTY: see the file PUBLIC for details. 
Processing pages 1 through 4. 
Page 1 
Page 2 
Page 3 
Page 4 

更新2: 由於KENS,我在一個時間除去一部分直到確認它是打破了下列參數:

-c "30000000 setvmthreshold" 

我在一個不同的論壇上試圖提高GS的速度。我是否錯誤地使用了它,或者我應該放棄它? PDF將會非常大,並且有100頁的頁面,所以我需要儘可能優化。有什麼建議麼?

任何人都可以指向正確的方向嗎? 謝謝

+0

如果你從命令行中省略'-q',你會得到任何有用的信息嗎? – devnull

+0

@devnull:Plz檢查帖子的更新。 – hofnarwillie

+0

爲輸出文件'-sOutputFile = test.png'嘗試一個固定的未加引號的名稱(可能是引用%的問題..) – agentp

回答

3

我相信,重寫您的命令行,從而改變參數的順序和添加-f表示輸入文件應該使其工作:

"C:\Program Files\gs\gs9.07\bin\gswin64c.exe" -dNOPAUSE -q -r150 -sDEVICE=png16m -dBATCH -dNumRenderingThreads=8 -sOutputFile=C:\output-%d.png -c "30000000 setvmthreshold" -f C:\input.pdf 

的從How to use Ghostscript以下應該使它明顯:

-c串...解釋參數作爲PostScript代碼最多以「-」後跟一個非數字開頭的一個參數,或與「@」。 例如,如果文件quit.ps僅包含單詞「quit」,則命令行上的 -c quit等於quit.ps。每個參數必須是有效的PostScript,或由令牌運算符定義的 個別令牌或包含有效PostScript的字符串。

-f將以下非切換參數解釋爲使用正常的run命令執行的文件名。由於這是默認的 行爲,-f僅用於終止交換機的令牌列表。

+0

謝謝!就像一個魅力... – hofnarwillie

+0

@hofnarwillie太棒了! – devnull

+0

良好的調用 - 在原來的-c由'-dNumRenderingThreads'終止,所以它不清楚什麼是錯誤的每個文檔.. – agentp

1

1)不要使用NumRenderingThreads。在150 dpi下,這隻會減慢速度。

2)我們需要看一個示例文件來評論很多。

3)我真的不知道這將如何導致您的默認打印機開始發射頁面。

開始用簡單的東西,確實:

gswin64c input.pdf

做什麼?我希望打開一個窗口來顯示PDF文件的第一頁,按回車會讓你看到下一頁,等等。

+0

謝謝您的建議。請參閱該帖子的更新。 – hofnarwillie

+0

除了在我的文章中的更新,你能告訴我爲什麼你說'NumRenderingThreads'會減慢速度。使用多線程應該只能加快速度,不是嗎? – hofnarwillie

+0

這是我從中得到的地方。 http://www.ghostscript.com/doc/current/Use.htm#Improving_performance我誤解了這個? – hofnarwillie

2

回答'爲什麼不使用NumRenderingThreads'問題。

其複雜的:-)

PostScript是一種解釋語言,並且只能運行作爲解釋的單個線程,因爲國家可以改變,當您去,和執行程序可以依靠的當前狀態。既然你不能多線程解釋器,你需要從程序的開始處開始並繼續到最後。

所以,爲了運行線程,我們編寫了一個'clist',這就是所謂的顯示列表。這不是被解釋的,它只是通過執行PostScript程序得到的輸出頁面上的圖形基元和位置的列表。注意clist是一個固定的分辨率,原始PostScript程序不是,PostScript程序可以根據它執行的環境採取不同的操作,clist不能,等等。

然後,我們將輸出頁面分成橫條紋,並使用clist爲每個條紋運行一個線程來渲染位於該條紋上的位。 clist允許多線程訪問,並且由於它沒有被解釋,所以值不會改變。有些對象會橫跨條紋,並且會(部分)渲染多次(這對於圖像數據很重要)。爲了創建最終頁面,我們將條紋拼接在一起。

這意味着整體上我們需要解釋程序寫入clist,多次讀取clist創建多個條紋,然後我們需要重新組合。

或者我們可以使用頁面緩衝區,一個足夠大的內存塊來保存整個輸出。我們解釋一次,然後按照我們的方式呈現。我們不寫一個clist,我們只渲染一個對象,而不需要合併輸出。毫不奇怪,這更快。

那麼clist和多線程有什麼意義?在高分辨率下,大多數系統沒有足夠的內存來保存整個輸出,所以我們產生條紋並將它們縫合在一起,這意味着我們需要一個clist。如果我們必須走這條路線,那麼是的,NumRenderingThreads會更快。

以150dpi,除非你是打印橫幅建築物的兩側,這是不太可能:-)

所以NumRenderingThreads 可以更快的情況下,但在你的情況下,它幾乎可以肯定」不是個噸。但無論如何,它可能非常快,你不能說。

+0

我看(或不)。這很複雜。我只是聽取你的意見。謝謝你的澄清。 – hofnarwillie

相關問題