平铺PDF透明度

我有一个使用Inkscape制作的PDF文件,其中使用了透明颜色。这个图像将用于LaTeX文档中。
保留透明度对于编辑来说很好,但对于打印可能会有问题。打印通常涉及将PDF转换为PS。由于Postscript不支持透明度,这要求进行以下操作之一:
- 平铺,即创建一个无需透明度的矢量图形 - 栅格化,即渲染位图图像
当使用Evince(或Cairo或Ghostscript)打印(或将其转换为PS)包含此类图形的PDF文档时,整个页面都会被渲染为位图,导致字体变得难看(与其他页面不同)。 (Adobe Acrobat可以很好地处理此类PDF文件。)
不幸的是,在将PDF图形转换为EPS(在LaTeX中包含它们之前)并不能解决问题,因为pdftops和pdf2ps(再次使用Cairo或Ghostscript)都会将图像栅格化,即渲染为位图(保存为EPS)。 (这稍微好一些,因为它不会影响整个页面,但我仍然更喜欢矢量图形。)
我该如何在Linux上使用Inkscape或其他软件平铺透明度?

2有趣的问题。将SVG展平会非常复杂,因为每个形状的可能交叉点都需要创建一个新的不透明形状,并进行组合填充。 - artfulrobot
1@artfulrobot 没错。生成的矢量图形通常会变得非常复杂。然而,对于许多典型的矢量线条艺术图形来说,结果在现代Postscript打印机上仍然能够很好地工作。 - Jan
最好的方法我找到的是一个繁琐的手动方法,包括在初始步骤后重新绘制。使用Inkscape将您的PDF转换为SVG,然后在一个好的文本编辑器中打开SVG文件。将所有的'opacity:[0][0-9.]'替换为'opacity:1'(正则表达式版本),或者找到'opacity:0.'并手动替换为opacity 1(繁琐的版本)。在Inkscape中打开SVG并使其再次看起来漂亮(最困难的部分),然后转换回PDF,最后再转换为EPS格式。 - Chris H
5个回答

绕过糟糕的光栅化的一种方法是手动将PDF文档转换为PostScript,因为当您通过evince或其他图形界面调用CUPS时,它将被自动转换。
您可以尝试使用pdftops -r 1200 document.pdf来增加分辨率(默认为低分辨率300),然后打印生成的PostScript文件。然而,在工作中使用的打印机上,这并没有带来显著的改善。有透明图像和无透明图像的页面上的常规文本仍然看起来不同--模糊与清晰。
所以我最终使用Acrobat Professional(在Windows机器上)来压平我的LaTeX文档中使用的透明图像,这给出了最佳结果。请检查高级打印设置中的透明度平坦器预设是否设置为[高分辨率]。 我的同事提到,也许可以直接将PDF文件通过FTP发送到现代激光网络打印机,绕过PostScript转换。我还没有尝试过这个方法。
能够有一个仅限于Linux的解决方案将会很好。

我遇到了同样的问题,这是我的解决方案(供以后参考):

我尝试了很多方法,到目前为止在互联网上找到的最好的解决方案是使用pdf2psps2pdf13将PDF完全渲染为图像,但结果对我来说并不令人满意,因为所有矢量形状都丢失了。我想要只渲染关键部分,但保留矢量图形。

对我起作用的是在inkscape中将所有关键部分隔离出来,并将它们放在一个单独的图层中(在我的图像中,这些是所有的阴影)。我只让这个图层(和背景图层)可见,并将其导出为PNG,有效地渲染了所有透明效果,但只有它们。然后我将其重新导入并在一个新的图层中使用。在翻转所有图层的可见性(透明图层:关闭,其他所有图层:打开)之后,导出的PDF与LaTeX完美配合,并且可以直接打印而无需将整个页面渲染为图像。

简而言之:

1. 将所有有问题的透明度隔离到一个图层中(透明度蒙版、阴影等)。 2. 仅显示有问题的图层和背景。 3. 导出为PNG格式。 4. 导入刚创建的PNG文件并用作背景。 5. 显示除了有问题的图层之外的所有图层。 6. 导出为PDF格式。 7. 微笑 :)。

我使用Ubuntu/Gimp打开了PDF文件,并每次打印一页,同时检查打印预览。

一种方法是在Inkscape中创建一个与页面大小相同的白色方框,并将其发送到底层。这样可以导出带有白色背景而不是透明背景的图像。

1问题不在于透明背景,加入白色背景也无法解决。图像问题是在其他(不透明)形状之上使用半透明形状。SVG 和 PDF 支持此功能,但 PS 不支持。 - Jan

pdftops -origpagesizes input.pdf output.ps

那么

ps2pdf -r600x600 output.ps input-new.pdf