使用 GhostScript 将 PDF 转换为透明 PNG
Posted
技术标签:
【中文标题】使用 GhostScript 将 PDF 转换为透明 PNG【英文标题】:Convert a PDF to a Transparent PNG with GhostScript 【发布时间】:2010-11-01 22:17:42 【问题描述】:我正在尝试使用 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 输出示例与上面的 pdf 位于同一位置,最后是 .png(*** 不允许我在帖子中包含多个 url)。
有趣的是,我发现使用 -dBackgroundColor 标志没有任何影响,甚至 如果我将其设置为非白色,例如 -dBackgroundColor=16#ff0000。可能 我对这个标志的语法理解是错误的。
另外有趣的是,我发现使用 -dTextAlphaBits=4 没有任何影响 -dGraphicsAlphaBits=4 标志尝试启用亚像素抗锯齿。我会 还感谢有关如何启用子像素抗锯齿的任何建议, 尤其是文字。
最后,我在 Mac OS 10.5.7 上使用 GPL Ghostscript 8.64 和渲染 我试图设置的工作流程是从 PrinceXML 输出的 PDF。我直接调用 Ghostscript 进行光栅化,而不是使用 ImageMagick,因为 ImageMagick 委托 Ghostscript 进行 PDF 光栅化,我应该能够通过直接调用 GS 更好地控制光栅化。
感谢您的帮助。
-乔恩·沃尔夫
【问题讨论】:
【参考方案1】:我与-dTextAlphaBits=4
和-dGraphicsAlphaBits=4
标志分享您的经验。它们似乎不适用于所有文本。我想出的“修复”是将图像渲染为所需大小的 4 倍,然后按比例缩小图像。幸运的是,ghostscript 在渲染千兆像素的 PNG 文件时没有问题。
更新
Ghostscript(最高版本 9)在渲染像素数超过 2.500.000(即 10 mb 的像素缓冲区)的透明 PNG 时似乎也存在重大问题。透明背景突然变白。
深入研究ghostscript的源码,我发现当像素缓冲区大小超过10mb时,它会切换到不同的内存分配方案。更具体地说,图像是使用设备image32
而不是pngalpha
渲染的。鉴于 pngalpha
驱动程序的实现方式,当 gs 决定不使用其 pngalpha_fill_rectangle()
时,其全部目的就消失了。
幸运的是,有一个名为-dMaxBitmap=N
的开关可以在运行时配置此参数。这在可追溯到 1999 年 1 月 15 日的一个完全不同的错误的解决方法中提到,请参阅http://pages.cs.wisc.edu/~ghost/doc/AFPL/5.50/relnotes/index.htm。
添加-dMaxBitmap=2147483647
为我解决了很多问题。在 64 位系统上,这个数字可能更高。
真正的解决方法当然是重新设计pngalpha
驱动程序,以便无论实际代码路径如何,它都将背景颜色设置为0x7f000000
,但大多数系统都有足够的内存来实现上述技巧。
【讨论】:
只是想说谢谢你的回答。我正在尝试使用gs 9.02
栅格化PDF,这是两个带有透明填充的PDF 的叠加(使用pdftk
完成);当我用-r 150
光栅化时,我只看到顶层可见,而底部几乎不可见。读完这篇文章后,我尝试了-dMaxBitmap=2147483647
,不幸的是它对我不起作用——但后来我开始降低分辨率,直到我发现-r80
(就我而言),最后颜色被正确渲染了——这可能意味着它是相同的内存错误。幸运的是,gimp
为我工作。干杯!
只是想说透明PNG对我来说很好用。我在 Windows 上使用 GhostScript 9.19,在 Linux 上使用 9.06。我正在使用这些选项:-q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 -sDEVICE=pngalpha -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r150
。我不知道它们中的任何一个是否有任何区别,它对我来说是开箱即用的,所以我没有玩弄它。【参考方案2】:
恐怕我不能告诉你 ghostscript 能做什么,但我有一个建议。尝试使用黑色和白色背景渲染您的 PDF。两个图像中任何相同的像素显然都是不透明的(即 alpha == 1.0)。不同的像素具有非零 alpha,可以通过从白色背景像素中减去黑色背景像素来计算。给出或取一些精度,任何红色、绿色或蓝色分量的值都将是 alpha 值。
【讨论】:
【参考方案3】:只有在构建时选择了“transpar”选项时,Ghostscript 才能处理透明度。假设您的 Ghostscript 是正确的版本,您可以在命令行中添加一个参数:
... -c "0 .setopacityalpha" -f c:/path/to/file/to/be/converted.pdf
(您可以使用 [0..1] 范围内的不透明度变体)。
另外,您是否尝试过使用 ImageMagick 的 @987654322 将 Ghostscript 创建的 .png(如果背景确实 是白色而不是透明)转换为透明背景@ 或 GraphicMagick 的 gm convert
命令?这是一个例子:
convert -background transparent test.png test_transp.png
顺便说一句,如果 Acrobat 或 AcroReader 将所有页面背景显示为白色:即使对于真正透明的背景,这也是默认设置。您可以在应用程序的设置选项中更改它:IIRC 该设置位于“页面显示”选项中并命名为 s.th。比如“显示透明度栅格”。 (如果我详细查找它,它可能不会有太大帮助——Adobe 会在每个新版本中不断改变所有选项。只需自己在那里四处寻找,现在你会发现它,因为你知道它就在那里。)
【讨论】:
以上是关于使用 GhostScript 将 PDF 转换为透明 PNG的主要内容,如果未能解决你的问题,请参考以下文章
使用 PHP(ghostscript) 将 PDF 转换为图像耗时太长
无法使用 ImageMagick 和 GhostScript 将 PDF 转换为 JPG