簡體   English   中英

使用GhostScript將PDF轉換為透明PNG

[英]Convert a PDF to a Transparent PNG with GhostScript

我試圖使用Ghostscript將具有透明背景的PDF文件光柵化為具有透明背景的PNG文件,但未成功。 我已經搜索了其他人嘗試相同的問題而沒有發布的解決方案的問題,據我所知,這些問題歸結為指定-sDEVICE = pngalpha,已經使用了我的測試文件。 在這一點上,我真的很感激任何經驗豐富的手可以提供的建議或提示。

我的測試PDF位於: http//www.kolossus.com/files/test.pdf

問題可能在於這個文件,但我對此表示懷疑。 據我所知,它沒有指定的背景,當我用像Photoshop或Illustrator這樣的透明感知應用程序打開文件時,確實它顯示的是透明背景。 但是,使用Adobe Reader等應用程序打開時,文件將以白色背景呈現。 我認為這與渲染PDF的應用程序有關,而不是與PDF本身有關 - 像Adobe Reader這樣的應用程序假設你想要看看打印文檔的樣子,因此總是在藝術作品背后顯示白色畫布 - 但是我不能確定。

我正在使用的gs命令是:

gs -dNOPAUSE -dBATCH -sDEVICE=pngalpha -r72 -sOutputFile=test.png test.pdf

這將生成一個PNG,該PNG在文件中藝術作品的邊界框之外具有透明像素,但是藝術品邊界框內的所有像素都在白色背景下進行光柵化。 這對我來說是一個問題,因為我的作品有陰影和抗鋸齒邊緣需要在最終輸出中保留,並且不能僅使用ImageMagick進行后處理。 我的PNG輸出示例與上面的pdf位於同一位置,最后是.png(stackoverflow不允許我在我的帖子中包含多個url)。

有趣的是,我發現使用-dBackgroundColor標志沒有任何影響,即使我將它設置為非白色的東西,如-dBackgroundColor = 16#ff0000。 也許我對這個標志語法的理解是錯誤的。

同樣有趣的是,我發現使用-dTextAlphaBits = 4 -dGraphicsAlphaBits = 4標志來嘗試啟用子像素抗鋸齒沒有任何影響。 我也很感激有關如何啟用亞像素抗鋸齒的任何建議,特別是在文本上。

最后,我在Mac OS 10.5.7上使用GPL Ghostscript 8.64,我試圖設置的渲染工作流程是從PrinceXML輸出的PDF生成透明的PNG圖像。 我直接調用Ghostscript進行光柵化而不是使用ImageMagick,因為ImageMagick委托Ghostscript進行PDF光柵化,我應該能夠通過直接調用GS來更好地控制光柵化。

謝謝你的幫助。

-Jon Wolfe

我與-dTextAlphaBits=4-dGraphicsAlphaBits=4標志分享您的經驗。 它們似乎不適用於所有文本。 我想出的“修復”是將圖像渲染為所需尺寸的4倍,然后縮小圖像。 幸運的是ghostscript渲染gigapixel PNG文件沒有問題。

更新

Ghostscript(最高版本9)在渲染像素數高於2.500.000(即10 mb像素緩沖區)的透明PNG時似乎也會遇到重大問題。 透明背景突然變白。

深入研究ghostscript的來源,我發現當像素緩沖區大小超過10 mb時,它會切換到不同的內存分配方案。 更具體地,圖像是利用設備呈現image32代替pngalpha 鑒於pngalpha驅動程序的實現方式,當gs決定不使用它的pngalpha_fill_rectangle()時,它的整個目的就會消失。

幸運的是,有一個名為-dMaxBitmap=N的開關可以在運行時配置此參數。 在一個變通方法中提到了一個可以追溯到1999-01-15的完全不同的bug,參見http://pages.cs.wisc.edu/~ghost/doc/AFPL/5.50/relnotes/index.htm

添加-dMaxBitmap=2147483647為我解決了很多問題。 在64位系統上,此數字可以更高。

一個真正的修復當然是重做pngalpha驅動程序,以便它將背景顏色設置為0x7f000000無論實際的代碼路徑如何,但是大多數系統都有足夠的ram用於上述技巧。

害怕我不能告訴你ghostscript可以做什么,但我確實有一個建議。 嘗試使用黑色和白色背景渲染PDF。 在兩個圖像中出現相同的任何像素顯然都是不透明的(即alpha == 1.0)。 不同的像素具有非零α,其可以通過從白色背景像素中減去黑色背景像素來計算。 給予或取一些精度,任何紅色,綠色或藍色分量的值將是alpha值。

只有在構建時選擇了“transpar”選項時,Ghostscript才能處理透明度。 假設您的Ghostscript是正確的版本,您可以在命令行上添加一個參數:

... -c "0 .setopacityalpha" -f c:/path/to/file/to/be/converted.pdf

(您可以在[0..1]范圍內使用變體作為不透明度)。

另外,您是否嘗試使用ImageMagick的convert或GraphicMagick的gm convert命令將Ghostscript創建的.png(如果背景確實是白色而不是透明)轉換為透明背景? 這是一個例子:

convert -background transparent test.png test_transp.png

順便說一句 ,如果Acrobat或AcroReader將所有頁面背景顯示為白色:即使對於真正透明的背景,這也是默認設置。 您可以在應用程序的設置選項中更改它:IIRC設置位於“頁面顯示”選項中並命名為s.th. 比如'Show transparency rasters'。 (如果我仔細查看它,它可能不會太多幫助 - Adob​​e會在每個新版本中不斷改變所有選項。只是在那里自己動手,你會發現它現在已經知道了它。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM