初めまして最近仕事でDTPをやり始めた若輩プログラマーです。
毎週処理されるPSファイル作成を自動化するため、Quarkなどを通さずプログラムで直に作成できるようにしようとPSコマンドを色々試していたところ、イメージの処理で謎のエラーが起きてしまいました。
newpath
%省略
gsave
20 20 translate
32 32 scale
16 8 4
[ 16 0 0 -8 0 8]
{ currentfile picstr readhexstring pop }
image
0123456789ABCDEF
123456789ABCDEF0
23456789ABCDEF01
3456789ABCDEF012
456789ABCDEF0123
56789ABCDEF01234
6789ABCDEF012345
789ABCDEF0123456
grestore
showpage
上記の用にnewpath後にイメージ処理を直に書き込むと問題なく表示できるのですが、
/TestData {
gsave
20 20 translate
32 32 scale
16 8 4
[ 16 0 0 -8 0 8]
{ currentfile picstr readhexstring pop }
image
0123456789ABCDEF
123456789ABCDEF0
23456789ABCDEF01
3456789ABCDEF012
456789ABCDEF0123
56789ABCDEF01234
6789ABCDEF012345
789ABCDEF0123456
grestore
} def
newpath
%省略
TestData
showpage
のようにdefで定義してから表示しようとすると、
%%[ Error: undefined; OffendingCommand: 0123456789ABCDEF ]%%
Stack:
3
%%[ Flushing: rest of job (to end-of-file) will be ignored ]%%
%%[ Warning: PostScript error. No PDF file produced. ] %%
とエラーになってしまいます。
もちろんラインや文字などはdefで定義しても問題なく表示されます。
イメージデータではdefによる置換などはできないのでしょうか?
KEI 2004/01/29 22:17:33
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
001
> { currentfile picstr readhexstring pop }
これは現在のファイルから16進文字列を読み込んで画像のデータソースにするということを表しています。
辞書に登録した内容はファイル上に展開されTestDataを置換するわけではなく、あくまで一連の手続きとして実行されるだけです。
現在のファイルマークはTestDataのあとにあるわけですからreadstringはそのあとをよみにいきます。
showpageから始まる文字列が読まれるわけですね。
その後0123456789ABCDEFが名前オブジェクトとして実行されるところでエラーになっているのだと思います。
で、解決策ですが、今回のように短いデータなら
20 20 translate
32 32 scale
16 8 4
[ 16 0 0 -8 0 8]
{<0123456789ABCDEF
123456789ABCDEF0
23456789ABCDEF01
3456789ABCDEF012
456789ABCDEF0123
56789ABCDEF01234
6789ABCDEF012345
789ABCDEF0123456>}
image
とかでうまくいきませんか?
Postscriptは普段使い慣れてないんでこっちではテストできないですけど。
データソースが長くなるなら
1. あらかじめデータソースのfilepositionを辞書登録
2. TestData冒頭部分で現在のfilepositionを一時辞書に登録
3. filepositionを1で登録した値に変更
4. image実行
5. filepositionを元に戻す
てな感じでいけそうな気がしますが。
のもと 2004/01/30 12:37:14
Mozilla/4.0 (compatible; MSIE 5.17; Mac_PowerPC)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
> Postscriptは普段使い慣れてないんでこっちではテストできないですけど。
だいじょぶそうですね。以下のデータをDistillerにかけたらちゃんと画像が4個描画できてました。
/TestData {
gsave
translate
32 32 scale
16 8 4
[ 16 0 0 -8 0 8]
{<0123456789ABCDEF
123456789ABCDEF0
23456789ABCDEF01
3456789ABCDEF012
456789ABCDEF0123
56789ABCDEF01234
6789ABCDEF012345
789ABCDEF0123456>}
image
grestore
} def
20 20 TestData
20 100 TestData
100 100 TestData
100 20 TestData
showpage
のもと 2004/01/30 13:52:12
Mozilla/4.0 (compatible; MSIE 5.17; Mac_PowerPC)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
003
ほんとだあ〜。感激。
無知の外野席 2004/01/30 18:36:28
Mozilla/4.7 [ja] (Macintosh; I; PPC)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
004
なるほど、def定義したものは展開時に置き換えられると思いこんでました(^^;
後はイメージデータをPSファイル用のフォーマットで出力するプログラムを作成すれば下地データは問題なく出力できますね。
ありがとうございます。
問題はQuarkやillustratorのデータを何とかすることか。
……手作業かなあ?(T_T)
KEI
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
[60] 旧掲示板 (2004/01/29 Thu 22:17)