3

我正在寻找一种path从 PDF 文件中删除所有对象的方法。

我怀疑这可能可以使用 Adob​​e Acrobat 中的 javascript 来完成,但非常感谢使用 ghostscript 或 mupdf 工具来完成它的提示。

无论如何,任何可行的解决方案都可以作为正确答案

4

1 回答 1

6

要使用 Ghostscript 执行此操作,您必须修改 pdfwrite 设备。事实上,您可能必须为任何 PDF 解释器做类似的事情。

你认为什么是“路径”对象?例如一个shfill?文字呢?使用类型 3 字体(构造路径)的文本怎么样?

剪辑路径呢?

如果您真的想这样做,我可以告诉您在哪里修改 pdfwrite,前提是您不介意重新编译 Ghostscript。

这可能是一个愚蠢的问题,但你为什么要这样做?您的问题是否可能有另一种解决方案?如果您想要做的只是删除填充路径(或者实际上是描边路径。一种解决方案是通过 ps2write 运行文件以获取 PostScript,预先添加代码以将“填充”和“描边”重新定义为无操作,然后运行通过 pdfwrite 文件返回以获取 PDF。

[阅读评论后添加]

PDF 没有“路径”对象,不像 XObject 是一种对象。路径由一系列操作创建,例如“newpath”、“moveto”、“curveto”和“lineto”。建立路径后,您可以使用“填充”或“描边”对其进行操作。请注意,PDF 也没有“文本”对象类型。

这就是为什么您的方法不起作用的原因,您无法删除“路径对象”,因为没有任何路径,路径是在内容流中创建的。您可以使用 Form XObject 来做类似的事情,但是路径构造在 Form 内容流中,它仍然不是一个单独的对象。

PostScript 也是如此,它们不是任何一种面向对象的语言。您无法在任何一种语言中“检测路径类型的矢量对象”,因为没有对象。在实践中,任何不是图像的东西都是矢量对象,并且是从路径构造的(并且通过剪辑,甚至某些图像也可能被视为路径)

您突出显示的 PostScript 将一个矩形添加到路径(路径在 PDF 或 PostScript 中不必是连续的)然后填充它。请注意,与 PostScript 中的通常做法一样,这些不是直接使用 PostScript 运算符,而是执行使用这些运算符的过程。程序在程序序言中定义。

顺便说一句,看起来您在这里使用了 pswrite 设备(无法确定这么小的样本)。如果是这种情况,您真的想从 ps2write 开始。否则你最终会得到很多东西退化成微小的填充矩形(pswrite 对许多图像类型进行此操作)

我没有建议您尝试“解密” ps2write 输出(它没有加密,它是压缩的)。

我的建议是创建一个 PostScript 文件,重新定义“显示”和/或“填充”运算符,使它们什么都不做,然后使用 pdfwrite 设备通过 Ghostscript 运行生成的 PostScript 程序。这将生成一个 PDF 文件,其中忽略所有描边和/或填充的对象。

[最后补充]

我拿起你的样本文件并检查了它。

我认为您看到的错误是 PDF 文件使用 /Separation 颜色(当然它不能无法填充矩形)和 ICCBased 替代并且没有设备空间色调转换。在这种情况下,当前版本的 ps2write 可能会解决您的问题。它(目前,这是由于更改)不保留 /Separation 颜色,而是将它们作为设备颜色发出,默认情况下为 RGB。因此,只需将文件转换为 PostScript 并返回 PDF 即可完全解决您的问题。

如果您知道问题出在哪里,如果您告诉我们会更快,我本可以首先为您提供这些信息和解决方法。

然后我使用 ps2write 创建了文件的 PostScript 版本(请注意,Separation 颜色现在是 RGB)并在 PostScript 程序前面加上两行:

/fill {newpath} bind def
/stroke {newpath} bind def

请注意,您必须使用保留二进制文件的编辑器。然后使用 pdfwrite 设备通过 Ghostscript 运行该 PostScript 程序,我获得了一个 PDF 文件,其中我认为您遇到问题的绿色“装饰”已经消失。

因此,您的问题有一个解决方案,并且可能还有一种更好的方法来解决您的问题。

于 2013-01-19T15:16:33.310 回答