如何在使用Ghostscript将PDF转换为EPS轮廓时保留页边距?

4
我正在使用Ghostscript将PDF文档转换为EPS文件。
我的目标是删除PDF中的文本信息(同时保留文本的矢量轮廓)。我通过先将其转换为EPS,然后再将其转换回PDF来实现这一点。(当然,我不指望阻止人们运行OCR以获取文本。)
我使用的命令是:
gs -q -dNOCACHE -dNOPAUSE -dBATCH -dSAFER \
   -sDEVICE=epswrite -sOutputFile=output.eps input.pdf

但是当我将结果为EPS的文件转换回PDF时,原始边距大多数被丢失,页面大小缩小,偶数页上的文本被裁剪在右侧。
有没有办法在转换过程中保持原始页面大小和边距?
我尝试过另一个工具"ps2eps"。虽然它支持指定页面大小,但实际上并没有删除文本信息,因此仍然可以从生成的PDF中选择和复制文本。这违背了我的初衷。
另一个缺点是它只支持转换单个页面,因此我必须先使用"psselect"将我的PDF转换为一组单页PS文件。
1个回答

2
首先不要使用epswrite(实际上在Ghostscript的最近版本中,您不能这样做-所以你一定是在使用旧版,请升级!)。您应该使用eps2write设备。
其次,不要进行PDF-> EPS-> PDF转换。
每个转换都会损失精度。如果您打算保留页面级别信息(如边距),则绝不要这样做。EPS文件被有意设计为具有紧密的边界框,还有其他要求,这可能使其不适合您的目的。
如果要保持页面级别数据,则应使用ps2write设备将其转换为PostScript而不是EPS。
请注意,在使用epswrite设备时,您并没有"删除文本信息(同时保持矢量轮廓的文本)",但在一般情况下,您正在将文本呈现为位图。丑陋,不易扩展!
为了明智地完成此操作,使用当前版本的Ghostscript(9.16),使用pdfwrite设备(用PDF输入,PDF输出),并选择-dNoOutputFonts开关。
这将完成您想要的内容:它将将文本绘制为矢量而不是文本。当然,结果将是一个不可搜索和免于复制/粘贴的PDF文件。

感谢您的建议。我放大了从EPS转换而来的PDF,它绝对是矢量曲线,而不是位图。我升级了我的GhostScript并尝试了您的PDF-in PDF-out方法。它运行得很好,但生成的PDF要大得多,可能是因为字形没有被重复使用。我的原始PDF大小为50 KB,通过EPS转换的PDF大小为20 KB,现在直接生成的PDF大小为800 KB。有趣的是,字形的形状似乎在EPS中被重复使用,这可以解释文件大小较小的原因。 - user31039
我发现自己现在无法再重现PDF->EPS->PDF的过程了。因此,这个答案是唯一可行的方法。 - user31039
唯一的方式使形状被“重复使用”是将它们存储为类型3字体中的字形描述。这是可能的,有些情况下epswrite会生成矢量字形描述而不是位图,但通常它会生成位图。请注意,无论它生成位图还是矢量图,它都会作为类型3字体进行处理,因此仍然保留文本信息。pdfwrite方法完全删除所有文本信息,但epswrite并不总是这样,尽管它会(再次强调,通常不是100%的时间)重新编码文本,使其对于复制/粘贴/搜索无用。 - KenS

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