我如何告诉 ghostscript 不要光栅化 eps 文件中的渐变?

How can I tell ghostscript not to rasterize gradients in eps files?

我正在寻找可以让我阅读、编辑和保存 .eps 文件的解决方案。我发现 ghostscript 可以提供所有这些机会。我需要的算法很简单:读取几个 .eps 文件,将它们连接成一个大文件并保存新的 .eps 文件。我已经可以做到了,但是有一个问题:新生成和保存的文件不保留渐变。渐变被栅格化,使用该渐变的形状被转换为剪贴蒙版。有没有办法告诉 ghostscript 不要在 eps 中栅格化渐变?

虽然我的 Windows 是 64 位的,但我使用的是最新的 32 位版本的 ghostscript 库(在 64 位版本的 ghostscript 上存在问题 运行 解决方案)。其实它不是那么重要,但我正在使用 C# 和 Ghostscript.Net.

编写

这是示例代码:

using (GhostscriptProcessor processor = new GhostscriptProcessor(lastInstalledVersion, true))
{
    List<string> switches = new List<string>();
    switches.Add("-o");
    switches.Add(@"-sOutputFile=" + outputFile);
    switches.Add("-sDEVICE=eps2write");
    switches.Add("-dUseCIEColor=true");
    switches.Add("-c");
    switches.Add("<</Install {0.5 0.5 scale}>> setpagedevice");
    switches.Add("-f");
    switches.Add(inputFile);

    processor.Process(switches.ToArray());
}

您所提问题的答案很简单;你不能。 eps2write 设备被称为是有原因的,它只生成 2 级 PostScript,而 shfill 运算符或类型 2 模式(PDF 中的着色字典)是 3 级 PostScript 原语。

但是,似乎没有充分的理由通过 Ghostscript 运行 退出文件。你说你已经有一些 EPS 文件。 EPS 文件的全部意义在于它们可以被视为 'black box',您无需知道其中的内容即可连接它们、重新排列它们等

您所要做的就是编写一些 'wrapper' PostScript,在完整包含 EPS 文件之前更改 CTM。您可以计算出缩放和平移的参数应该是什么,因为 EPS 文件将有一个 %%BoundingBox 注释,告诉您它在用户 space 中的位置。您需要做的就是改变比例,并使用平移偏移 0,0 原点(左下角)。

请注意,eps2write 设备由于仅限于生成 2 级 PostScript,因此也不支持原始 2 级规范之外的其他一些 PostScript 功能,例如 CIDFonts。