0

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 を呼び出さない場合は、2 番目のケースが機能します。

/form_test 行をその下のコメントアウトされた行と交換すると、正常に動作します。しかし、この行は何をしているのですか?フォームがグローバル VM リージョン内で動作するように強制しているように見えますが、これが問題になる理由と、エラーが発生した場合に次の「selectfont」にエラーが伝播する理由がわかりません。

Acrobat Distiller がこれに対処できるのはなぜですか? Postscript は正しいですか? ありがとう。

編集:周囲のコマンドを gsave/grestore の代わりに保存/復元に変更すると、問題が 2 番目のテキストに影響を与えるのを防ぐことができますが、これはフォーム内でフォントが不明な理由を説明していません。また、フォームにはグラフィックス状態以外の副作用がないため、gsave/grestore で十分であると考えています。

4

1 に答える 1

0

ArailMT は、ほとんどの場合、TrueType フォントの「フォント」ではありません。タイプ 42 の定義を以前に埋め込んでいない限り、PostScript プログラムの断片から判断するのは常に困難です。

なぜグローバル VM ですべてを実行しているのですか? そして globaldict も使用していますか?これらはどちらも非常に悪い慣行であり、グローバル VM 内のものは保存および復元の対象にならないため、ジョブが終了するまでメモリを消費します。

実際にグローバル VM コンテキストでフォームを実行すると、フォームの過程で定義されたすべてのリソースがグローバル VM に保存されるため、さらに悪化します。フォント リソースが既に存在しない限り、フォント リソースを定義する「selectofnt」を呼び出すためです。グローバル VM で実行しているため、ローカル VM ではなくグローバル VM でフォントが定義され、より多くのメモリが使用されます。

PostScript は「正しい」ものです。C プログラムが語彙的には正しくても、期待どおりの動作をしないのと同じ意味です。

グローバル VM を使用する正当な理由がない場合は、使用しないでください。これが最も簡単な答えです。

于 2013-08-28T07:23:47.987 に答える