我在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&#39;如果它们发生。
为什么Acrobat Distiller可以处理这个问题 - 是不是正确的Postscript?感谢。
编辑:显然更改周围的命令以保存/恢复而不是gsave / grestore可以防止问题影响第二个文本,但这并不能解释为什么字体在表单中是未知的。另外我相信gsave / grestore应该足够了,因为除了图形状态外,表单应该没有副作用。
答案 0 :(得分:0)
ArailMT几乎肯定不是一种'字体',它是一种TrueType字体,除非你之前已经嵌入了一个42型定义,它总是很难从PostScript程序的片段中分辨出来。
为什么你在全球VM中做一切?并使用globaldict?这些都是非常糟糕的做法,全局VM中的任何内容都不会受到保存和恢复,因此它会占用内存直到作业结束。
实际上,在全局VM上下文中执行表单会更糟糕,因为它会将表单过程中定义的任何资源存储在全局VM中。因为你调用'selectofnt'来定义字体资源,除非它已经存在。因为您使用全局VM运行,它将在全局VM中定义字体而不是本地VM,从而占用更多内存。
PostScript是'正确的',就像C程序在词法上是正确的一样,但不能达到预期的目的。
如果你没有充分的理由使用全局虚拟机,那么最简单的答案就是。