我在 Ghostscript 9.06 中看到了一些奇怪的行为,我想知道这是否与我的 PS 结构或其他原因有关。
我们定义了一个嵌入字体,然后尝试设置一个表单并使用它,如下所示。在下面,我还有一些行可以在不使用表单的情况下直接将文本放在页面上。
globaldict
begin
true setglobal
/frm_test <<
/FormType 1 /BBox [-842 -842 596 596] /Matrix [1 0 0 1 0 0] /PaintProc { pop
/ArialMT 7.0 selectfont
0 0 moveto
(Test text form) show
} %endPaintProc
>> /Form defineresource pop
/form_test {/frm_test /Form findresource true setglobal execform false setglobal} bind def
%/form_test {/frm_test /Form findresource execform} bind def
false setglobal
end
gsave
10 820 translate
form_test
grestore
/ArialMT 7.0 selectfont
10 800 moveto
(Test text normal) show
showpage
这里的问题是对 form_test 的调用会破坏两种情况下的字体定义——Ghostscript 找不到指定的字体。如果我从不调用 form_test 那么第二种情况有效。
如果我将 /form_test 行与下面注释掉的行交换,那么它可以正常工作。但是这条线在做什么?它似乎迫使表单在全局 VM 区域内运行,但我不确定为什么这很重要,以及为什么如果发生任何错误会传播到以下“selectfont”。
为什么 Acrobat Distiller 可以处理这个问题 - Postscript 是否正确?谢谢。
编辑:显然将周围的命令更改为保存/恢复而不是 gsave/grestore 可以防止问题影响第二个文本,但这并不能解释为什么表单中的字体未知。我也相信 gsave/grestore 应该足够了,因为除了图形状态之外,表单应该没有副作用。