为什么 ghostscript 使用 pdfmark /BP、/EP、/SP 更快?
Why is ghostscript much faster with pdfmark /BP, /EP, /SP?
我们有一些遗留代码,我很难理解 - 原作者已经不在了。
显然,对于某些文件,Ghostscript PS 到 PDF 的转换速度非常慢,但是如下所示放置对象定义可以极大地加快速度(对于一个约 20,000 页的文件,我们将 8 小时以上的时间缩短到 8.5 分钟,而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
您很可能使用的是旧版本的 Ghostscript。您的原始片段使用 PostScript 表单,这是不寻常的,旧版本的 pdfwrite 设备没有将表单保留为表单,而是每次使用时 'unrolled' 表单定义。
不出所料,这会导致 大得多 的输出文件,尤其是如果表单可能占内容的大部分并用在每个页面上。
pdfmark代码定义了一个PDF对象,然后每次都引用该对象。只有一个对象,所以文件小得多,所以你花费很多的时间组装它,复制相同的数据 20,000 次。
当然,新版本的 pdfwrite 设备将保留表单,因此很可能直接创建和引用 PDF 对象的好处早已不复存在。
它与表单缓存无关(不是 'execform caching'),它与输入 PostScript 中的表单是否保留为输出 PDF 中的表单有关。
顺便说一下,理解为什么性能很差很重要,否则你不可能理解为什么另一种方法更快。
我们有一些遗留代码,我很难理解 - 原作者已经不在了。
显然,对于某些文件,Ghostscript PS 到 PDF 的转换速度非常慢,但是如下所示放置对象定义可以极大地加快速度(对于一个约 20,000 页的文件,我们将 8 小时以上的时间缩短到 8.5 分钟,而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
您很可能使用的是旧版本的 Ghostscript。您的原始片段使用 PostScript 表单,这是不寻常的,旧版本的 pdfwrite 设备没有将表单保留为表单,而是每次使用时 'unrolled' 表单定义。
不出所料,这会导致 大得多 的输出文件,尤其是如果表单可能占内容的大部分并用在每个页面上。
pdfmark代码定义了一个PDF对象,然后每次都引用该对象。只有一个对象,所以文件小得多,所以你花费很多的时间组装它,复制相同的数据 20,000 次。
当然,新版本的 pdfwrite 设备将保留表单,因此很可能直接创建和引用 PDF 对象的好处早已不复存在。
它与表单缓存无关(不是 'execform caching'),它与输入 PostScript 中的表单是否保留为输出 PDF 中的表单有关。
顺便说一下,理解为什么性能很差很重要,否则你不可能理解为什么另一种方法更快。