从PDF中删除所有矢量路径

3
我正在寻找一种从PDF文件中删除所有path对象的方法。我猜想可以使用Adobe Acrobat中的javascript实现,但若有关于ghostscript或mupdf工具的方法,将不胜感激。
总之,任何可行的解决方案都可以作为正确答案。

http://www.ehow.com/how_5855882_remove-document-path-adobe-pdf.html - Rachel Gallen
谢谢Rachel,但那是用于删除链接目标的。我正在寻找一种方法来删除矢量路径对象。 - theta
1个回答

6
要使用Ghostscript来实现这一点,您需要修改pdfwrite设备。事实上,您可能需要对任何PDF解释器进行类似的操作。
您认为“路径”对象是什么?例如shfill?文本呢?使用类型3字体的文本呢(构建路径)?
剪辑路径怎么样?
如果您真的想追求这个目标,我可以告诉您在哪里修改pdfwrite,前提是您不介意重新编译Ghostscript。
这可能是一个愚蠢的问题,但您为什么要这样做?是否可能存在其他解决方案?如果您只想删除填充路径(或确实描边路径),那么一种解决方案就是通过ps2write运行文件以获取PostScript,将代码前置为将“fill”和“stroke”重新定义为no-ops,然后再通过pdfwrite运行该文件以获取PDF。
[阅读评论后添加]
PDF没有“路径”对象,不像XObject是对象的一种类型。路径是通过一系列操作创建的,例如“newpath”,“moveto”,“curveto”和“lineto”。一旦您构建了路径,那么您就可以使用“fill”或“stroke”对其进行操作。请注意,PDF也没有“text”对象类型。
这就是为什么您的方法不起作用的原因,您无法删除“路径对象”,因为根本没有这样的对象,路径是在内容流中创建的。您可以使用Form XObject来实现类似的效果,但是路径构造在Form内容流中,它仍然不是单独的对象。
PostScript也是如此,这些都不是任何类型的面向对象语言。您无法在任一语言中“检测到类型为路径的矢量对象”,因为根本没有对象。在实践中,任何不是图像的东西都是矢量对象,并且是使用路径构建的(并且通过剪辑,甚至有些图像可以被认为是路径)。
您突出显示的PostScript片段将一个矩形添加到路径中(在PDF或PostScript中,路径不必连续),然后对其进行填充。请注意,在PostScript中通常情况下,这些都不是直接使用PostScript运算符,而是执行使用运算符的过程。这些过程在程序序言中定义。
顺便说一句,看起来您在这里使用了pswrite设备(无法确定样本如此小)。如果是这种情况,您真正想要开始使用ps2write。否则,您最终会得到大量几乎看不见的小填充矩形(对于许多图像类型,pswrite都会这样做)。
我没有建议您尝试“解密”ps2write输出(它没有加密,它是压缩的)。
我建议创建一个PostScript文件,重新定义“show”和/或“fill”运算符,使它们什么都不做,然后使用pdfwrite设备将生成的PostScript程序再次运行回Ghostscript。这将产生一个PDF文件,其中所有描边和/或填充对象都被忽略。

[final addition]

我拿到了您的样本文件并进行了检查。

我猜想您遇到的问题是因为PDF文件使用了带有ICCBased替代品而没有设备空间色彩转换的/Separation颜色(它肯定不能不填充矩形)。在这种情况下,当前版本的ps2write可能会解决您的问题。它(目前是这样的,但这将改变)不保留/Separation颜色,而是默认将其作为设备颜色发射,RGB格式。因此,简单地将文件转换为PostScript格式,再转回PDF格式,可能会完全解决您的问题。

如果您知道问题所在,如果您告诉我们,我们就可以更快地为您提供信息和解决方案。我可以在第一时间为您提供这些信息和解决方法。

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

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

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

谢谢Ken。我有几个PDF文件,在移动渲染器上会出现问题,因为这些路径对象。它们是path类型的对象,就像xobjecttext等类型的对象一样。它们只是一些页面装饰,我希望能指示ghostscript遍历每个pdf对象,如果检测到path对象,则删除它。我很快会尝试将示例文件转换为postscript,并使用您的提示或类似方法来处理它,然后回复。 - theta
Ken,我将示例页面转换为ps格式,并找到了矢量路径的一部分:编辑器截图,但我不知道如何检测路径类型的矢量对象。 我还将同一页导出为ps2,但无法解密任何有意义的内容。 - theta
1
你可能想添加一些示例。也许这些是损坏的路径对象,只需要修复即可... - mkl
@mkl,手机是相当老的塞班E61i,我在上面安装了2个无法正常使用的PDF阅读器。我不会透露这些阅读器的名称,因为我已经知道并确定了问题所在。我的需求和这个问题所询问的,以及其他潜在用户想要看到的是 - 如何从PDF文件中删除所有矢量路径。谢谢。 - theta
@theta 我本来更希望能够重现这个问题,以便确定哪些路径操作失败了。正如KenS所暗示的那样,有不同类型的路径操作,删除其中一些(特别是剪切路径)可能会完全改变PDF的外观。我明天会在办公室仔细查看你的样本。 - mkl
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接