使用pdfmark / BP,/ EP,/ SP,为什么ghostscript会更快?

时间:2017-06-27 04:47:44

标签: pdf pdf-generation ghostscript postscript

我们有一些难以理解的遗留代码 - 原作者已经消失了。

显然,对于某些文件来说,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

1 个答案:

答案 0 :(得分:2)

您最有可能使用旧版本的Ghostscript。您的原始片段使用PostScript表单,这是不寻常的,旧版本的pdfwrite设备不会将表单保留为表单,而是“展开”#9;每次使用时的表格定义。

毫不奇怪,这会导致更多更大的输出文件,特别是如果表单可能是大部分内容并且在每个页面上使用的话。

pdfmark代码定义PDF对象,然后每次引用该对象。只有一个对象,因此文件要小得多,因此您花费的时间来组装它,并将相同的数据复制20,000次。

当然,新版本的pdfwrite设备将保留表单,因此很可能直接创建和引用PDF对象的好处早已不复存在。

它与表单缓存无关(不是' execform缓存'),它与输入PostScript中的表单是否保存为输出PDF中的表单无关。

顺便说一句,重要的是要理解为什么表现不佳,而且你不能理解为什么另一种方法更快。