我们有一些难以理解的遗留代码 - 原作者已经消失了。
显然,对于某些文件来说,Ghostscript PS到PDF的转换速度非常慢,但是将对象定义放在下面可以大大加快它(我们正在谈论8个小时到8.5分钟,一个~2,000页的文件,而Adobe Distiller需要大约20分钟在原始版本上使用默认选项)。
原始文件摘录(使用PReS创建):
/@GP
{
save exch mark exch
execform
cleartomark restore
} bd
...
gsave 0.62 0.62 scale @TestGraphic @GP grestore
@TestGraphic是EPS图像。这似乎并不重要,因为其他程序使用具有类似问题的不同非EPS图像。
修改过的文件:
[/_objdef {new_graphic} /BBox [0 0 595 842] /BP pdfmark
@TestGraphic @GP
[/EP pdfmark
...
gsave 0.62 0.62 scale
[ {new_graphic} /SP pdfmark
grestore
我们在Unix和Windows上看到过各种gs
版本的类似行为。时间安排采用相当标准的选项:
"c:\Program Files (x86)\gs\gs9.21\bin\gswin32c" \
-dNOPAUSE -dBATCH -sDEVICE=pdfwrite -o test.pdf test.ps
我对诊断为什么它很慢很感兴趣(从文件中删除敏感数据需要很长时间,但我可以尝试,如果真的需要它),而是反对定义和pdfmark命令提供了什么好处。
原始脚本引用http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/postscript/pdfs/5113.Forms.pdf,旨在为某些打印机RIP和Distiller(每个都使用大型全彩色图像进行处理)启用execform缓存,但是Ghostscript不支持execform缓存,因此这种替代pdfmark技术被采纳,没有说明原因。
编辑:添加了表单定义的要点并删除了数据:
https://gist.github.com/anonymous/676924d451188276053b9b472279e382
答案 0 :(得分:2)
您最有可能使用旧版本的Ghostscript。您的原始片段使用PostScript表单,这是不寻常的,旧版本的pdfwrite设备不会将表单保留为表单,而是“展开”#9;每次使用时的表格定义。
毫不奇怪,这会导致更多更大的输出文件,特别是如果表单可能是大部分内容并且在每个页面上使用的话。
pdfmark代码定义PDF对象,然后每次引用该对象。只有一个对象,因此文件要小得多,因此您花费多的时间来组装它,并将相同的数据复制20,000次。
当然,新版本的pdfwrite设备将保留表单,因此很可能直接创建和引用PDF对象的好处早已不复存在。
它与表单缓存无关(不是' execform缓存'),它与输入PostScript中的表单是否保存为输出PDF中的表单无关。
顺便说一句,重要的是要理解为什么表现不佳,而且你不能理解为什么另一种方法更快。