使用GhostScript将PDF转换为透明PNG

时间:2009-06-10 19:01:18

标签: pdf png transparency 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,它在边界框外面有透明像素 文件中的艺术作品,但作品中的所有像素 边界框被光栅化在白色背景下。这是个问题 对我来说,因为我的艺术作品有阴影和抗锯齿的边缘需要 保存在最终输出中,不能只是后处理 ImageMagick的。我的PNG输出示例与上面的pdf位于同一位置,最后是.png(stackoverflow不允许我在帖子中包含多个网址)。

有趣的是,我发现使用-dBackgroundColor标志没有任何影响 如果我将它设置为非白色的东西,如-dBackgroundColor = 16#ff0000。也许 我对这个标志语法的理解是错误的。

同样有趣的是,我发现使用-dTextAlphaBits = 4没有任何影响 -dGraphicsAlphaBits = 4个标志,用于尝试启用子像素抗锯齿。我会 也欣赏有关如何启用亚像素抗锯齿的任何建议, 特别是在文字上。

最后,我在Mac OS 10.5.7上使用GPL Ghostscript 8.64和渲染 我正在尝试设置的工作流程是从中生成透明的PNG图像 PrinceXML输出的PDF。我直接调用Ghostscript进行栅格化而不是使用ImageMagick,因为ImageMagick委托Ghostscript进行PDF光栅化,我应该能够通过直接调用GS来更好地控制光栅化。

感谢您的帮助。

-Jon Wolfe

3 个答案:

答案 0 :(得分:18)

我与-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用于上面诀窍。

答案 1 :(得分:2)

害怕我不能告诉你ghostscript可以做什么,但我确实有一个建议。尝试使用黑色和白色背景渲染PDF。在两个图像中出现相同的任何像素显然都是不透明的(即,alpha == 1.0)。不同的像素具有非零α,其可以通过从白色背景像素中减去黑色背景像素来计算。给予或采取一些精确度,任何红色,绿色或蓝色分量的值将是alpha值。

答案 2 :(得分:2)

只有在构建时选择了“transpar”选项时,Ghostscript才能处理透明度。假设您的Ghostscript是正确的版本,您可以在命令行上添加一个参数:

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

(您可以在[0..1]范围内使用不透明度的变体。)

此外,您是否尝试使用ImageMagick的{{将Ghostscript创建的.png(如果背景 确实 是白色而不是透明)转换为透明背景1}}或GraphicMagick的convert命令?这是一个例子:

gm convert

BTW ,以防Acrobat或AcroReader将所有页面背景显示为白色:即使对于真正透明的背景,这也是默认设置。您可以在应用程序的设置选项中更改它:IIRC设置位于“页面显示”选项中并命名为s.th.比如'Show transparency rasters'。 (如果我仔细查看它,它可能不会太多帮助 - Adob​​e会在每个新版本中不断改变所有选项。只需在那里自己动手,你就会发现它现在就知道它就在那里。)< / em>的