从PDF中删除所有矢量路径

时间:2013-01-19 14:41:42

标签: pdf ghostscript mupdf

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

我怀疑这可能是在Adobe Acrobat中使用javascript完成的,但非常感谢使用ghostscript或mupdf工具进行操作。

无论如何,任何可行的解决方案都是可接受的正确答案

1 个答案:

答案 0 :(得分:6)

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

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

剪辑路径怎么样?

如果你真的想要追求这个,我可以告诉你在哪里修改pdfwrite,只要你不介意重新编译Ghostscript。

这可能是一个愚蠢的问题,但你为什么要这样做呢?是否可能有另一种解决方案可以解决您的问题?如果您要做的就是删除填充路径(或者实际上是描边路径。一种解决方案是通过ps2write运行文件以获取PostScript,将代码重新定义为'fill'和'stroke'作为no-ops,然后运行通过pdfwrite回复以获取PDF。

[阅读评论后添加]

与XObject(一种对象)不同,PDF没有'path'对象。路径由一系列操作创建,例如'newpath','moveto','curveto'和'lineto'。一旦你建立了一条路径,你就可以用“填充”或“笔划”对其进行操作。请注意,PDF也没有“文本”对象类型。

这就是为什么你的方法不起作用,你不能删除'路径对象',因为没有,路径是在内容流中创建的。您可以使用Form XObject执行类似的操作,但是然后路径构造位于Form内容流中,它仍然不是单独的对象。

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

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

顺便说一句,看起来你在这里使用了pswrite设备(不能确定这么小的样本)。如果是这种情况,你真的想从ps2write开始。否则你最终将会有很多东西退化为微小的填充矩形(pswrite会使用许多图像类型)

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

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

[最后补充]

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

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

如果你知道问题是什么,如果你告诉我们的话会更快,我可以在第一时间给你这些信息和解决方法。

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

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

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

因此,您的问题有一个解决方案,也可能是解决问题的更好方法。