PPDのファイル構造


いきなりですが、結構要望の多いPPDについて説明します。本当はもっと丁寧に説明したいのですが、何ぶん多忙なもので。でもこれだけでも少しは役に立つと思います。頑張って下さいね。


-実際のPPDファイルとその説明- ※必須のキーワードは太字で表しています。

*PPD-Adobe: "4.3"
PPDの先頭は必ずこの1行が入る。
このPPDはバージョン4.3の仕様に従って書かれていますという意味。

*% Adobe Systems PostScript(R) Printer Description File
*%で始まるのは全てコメント(注釈)。意味はありません。
*% Copyright 1987-1995 Adobe Systems Incorporated.
*% All Rights Reserved.
*% Permission is granted for redistribution of this file as
*% long as this copyright notice is intact and the contents
*% of the file is not altered in any way from its original form.
*% End of Copyright statement
ちなみに殆どのPPDにはここのコメントに、改変しなければ自由にコピーしていいよというような事が書かれています。でも一体誰がこんな所を読んでいるんでしょう?
*FormatVersion: "4.3"
このPPDのフォーマットバージョン。1行目と同じ数字を入れておいて下さい。
*FileVersion: "1.0"
色々とPPDを作った時の管理用に使って下さい。通常最初は1.0から始めますが、適当にどうぞ。
*LanguageEncoding: ISOLatin1
PPDで使われている言語。英語だとISOLatin1、日本語(シフトJIS)だとJIS83-RKSJと書きます。
*LanguageVersion: English
*LanguageEncoding:と対になります。英語だとEnglish、日本語だとJapanese。
*PCFileName: "SEP123.PPD"
早い話がMS-DOSでの名前。半角8文字.PPD。製品に添付するようなPPDの場合、先頭2文字が企業名なんていうのがあったと思うけど、個人が勝手に作る分には関係ないです。
*Product: "(SeraPrinter)"
使用するRIPやPSプリンタのProduct名を入れて下さい。以下のPSを流すと出てきます。
[Level2以上の場合] product == flush
[Level1の場合] statusdict /product get exec == flush end
PSファイルを一旦スプールに溜めてから展開するRIP(岩崎通信機(株)ELEFAXなど)の場合、この記述だけでは実行結果が出ない場合があります。そういう時は結果を用紙に出力するようにPSを修正して下さい。
例) リュウミンライトでproductを出力します。※ページサイズは指定していないので、このまま出力するとRIPやプリンタのデフォルトページサイズになります。
%!
/Ryumin-Light-83pv-RKSJ-H findfont 50 scalefont setfont
50 50 moveto product show
showpage

*PSVersion: "(2017.0801) 1"
これも使用するRIPやPSプリンタに合わせて下さい。
[()内の数字] version == flush
[()の右の数字 Level2以降] revision == flush
[()の右の数字 Level1] statusdict /revision get exec == flush

*ModelName: "SeraPrinter123"
プリンタ名。使ってもいい文字は半角で、英数字、スペース、ピリオド(.)、ハイフン(-)、スラッシュ(/)、プラス(+)です。
*NickName: "SeraPrinter123"
プリンタのニックネーム。*ModelName: と同じにしておくのが無難。
*ShortNickName: "SeraPrinter123"
プリンタのニックネーム、但し31文字以内。*ModelName: と同じにしておくのが無難ですが、ここのプリンタ名が32文字以上ある場合は適当に縮めて下さい。
*% === Options and Constraints =========

*% ==== Device Capabilities ===============
*ColorDevice: True
そのRIPやプリンタがカラーのデータを受け取れるかどうか。FalseにするとQuarkXPressなどは、Quark上で作ったカラー部分を勝手にモノクロデータにして送ったりします。Adobe社の仕様にはないけど、RIPで分版して出力はモノクロ4版という場合も、Trueにしておかないとうまくいきません。
*DefaultColorSpace: CMYK
そのRIPやプリンタがどういうカラーを使っているか。モノクロだとGray、カラーだとCMYKにしておいて下さい。その他、CMY、RGBなんていうのもあります。
*FileSystem: True
そのRIPやプリンタにファイルを書き込み出来るようなものが付いているかどうか。ハードディスクが付いているようなのやMac上で動くようなのは当然True。
*LanguageLevel: "2"
PostScript Level1かLevel2かPostScript3か。1か2か3を入れて下さい。
*FreeVM: "250000"
メモリの最大空き容量。起動直後に以下のPSを送って出た値を入れると大体OK。
vmstatus exch sub == pop
*Throughput: "40"
片面プリントの最速モードで1分間に最大何枚プリント出来るか。厳密には小数点を繰り上げて1以上の整数に、実際には大体どの位出るか多めに書いておけばOKです。
*VariablePaperSize: True
可変ページサイズがOKかどうか。イメージセッタだと大概True、プリンタだとFalseです。
*TTRasterizer: Type42
Type42 (TrueType)を解釈出来るか出来ないか。出来ない場合はNone(この項目自体なくてもいいけど)。
TrueTypeフォントを出す時、そのままのデータではRIPやプリンタでは出せません。そこでもしRIPやプリンタがType42というフォーマット(データ形式)に対応していれば、TrueTypeのデータをType42というデータに変換して出力します。そういう事が出来るかどうかです。Windowsから出力する時、よく見るとそういうチェックボックスがあったりします。

*Password: "0"
ごくごく簡単に考え方を説明すると、PSでも特殊モード(管理者モードのようなもの)にならないと使えないコマンドというのがあって、そのモードにする為に使うパスワード。と言ってもほとんどのRIPやプリンタのパスワードは0(ゼロ)なんですけど。
*ExitServer: "
count 0 eq
{ false } { true exch startjob } ifelse
not {
(WARNING: Cannot modify initial VM.) =
(Missing or invalid password.) =
(Please contact the author of this software.) = flush quit
} if
"
*End
今まではキーワード(*で始まるもの)に対しての答えが1行だったのですが、ここでは数行あります。そんな場合は回答を" "で囲み、その次の行に *END と付けます。
それはともかく、*ExitServer は特殊モードに入る為の記述。当然パスワードが必要です。
特殊モードに入ると何が出来るかと言うと、よくあるのがRIPやプリンタのデフォルト値を変更したり、あるPSコマンドが来た時に別の処理をさせたい時に使います。一般的には電源が切れるまで有効。

*% Multiple Resolution support for Harlequin ==============
*OpenUI *Resolution: PickOne
*OpenUIから*CloseUI:までが1セット。ここではResolution(解像度)を、PickOneで1つ選べという意味。こういう記述があるとMacやWindowsからプリントする際、プルダウンメニューが出てきて1つ選ぶ事になります。
*OrderDependency: 50 AnySetup *Resolution
説明が難しいのですが、まず50というのがPSを作成する時どの順番に書くかの値。数字の少ないもの順に書いていき、同じ数字のものはどの順でもいいと。例えばこのPPDの場合、もし別の設定で40というのがあれば、ResolutionのPS記述はその40の後ろにきます。
*DefaultResolution: 2400dpi
デフォルト解像度。最初に設定を開けた時2400dpiになっているし、何も設定しないと2400dpiが選ばれたものとみなされます。
*Resolution 1200dpi: "1 dict dup /HWResolution [1200 1200] put setpagedevice"
*Resolution 2400dpi: "1 dict dup /HWResolution [2400 2400] put setpagedevice"
Resolution(解像度)に1200dpiや2400dpiが選ばれた時、その後ろの" "内のPS記述をプリンタに送る(又はファイル作成する)。
*?Resolution: "
先頭に?があるのは、プリンタへの問い合わせ方法です。" "内をプリンタに送れば解像度が返ってきます。勿論" "内はPS記述です。
save
currentpagedevice /HWResolution get
0 get
( ) cvs print (dpi) = flush
restore"
*End
この*Endは*?Resolution:がここでおしまいという意味。
*CloseUI: *Resolution
*Resolutionについてはここでおしまい。

*% Halftone Information ===============
*ScreenFreq: "133.0"
線数の初期値。RIPやプリンタの起動直後、currentscreen等の線数が分かるコマンドを実行し、返される値を入れる。単位はlpi。
*ScreenAngle: "45.0"
角度の初期値。RIPやプリンタの起動直後、currentscreen等の角度が分かるコマンドを実行し、返される値を入れる。単位は度。
*DefaultScreenProc: Dot
網点形状の初期値。RIPやプリンタの起動直後、currentscreen等の角度が分かるコマンドを実行し、返された網点形状が*ScreenProcのどのキーワードとして定義されているかを入れる。
*ScreenProc Dot: "{ abs exch abs 2 copy add 1 gt {1 sub dup mul exch 1 sub
dup mul add 1 sub} {dup mul exch dup mul add 1 exch sub}ifelse } bind"
*End
*ScreenProcの選択肢をキーワードと共に書く。Dotは2行にわたっているので" "で囲まれた後*Endで終わっています。ちなみにこの網のPS記述が一番一般的な網点形状、30%位までが円、50%で四角、そしてまた円になるという形状です。
*ScreenProc Line: "{ exch pop abs neg } bind"
*Lineの方は1行で済むので*Endは必要ありません。

*AccurateScreensSupport: True
Adobe社のアキュレートスクリーンというのに対応しているかどうか。これは網点を作る時に複数の網点を考慮して出来るだけ正確に網を作成するという技術で、詳しくはPostScriptリファレンスマニュアルに載ってます。通常Trueのままで構いません。
*DefaultTransfer: Null
トランスファー関数の初期値設定。記述自体はプリンタのキャリブレーション設定(カラーマネジメント)等にも使われますが、初期値としてここに何か入っているものって私は見た事がありません。
*Transfer Null: "{ } bind"
上記*DefaultTransferのNullの実際のPS記述。{} bind は「何もしない」のと同じですね。
*Transfer Null.Inverse: "{ 1 exch sub } bind"
ネガ記述、なのですが、実際にアプリケーションからネガ出力する場合、アプリ独自の方法を使用する事も多いので、ここはあんまり関係ないと思います。

*% Paper Handling ===================
*% Use these entries to set paper size most of the time, unless there is
*% specific reason to use PageRegion or PaperTray.
*DefaultPageSize: A4
RIPやプリンタのページサイズ初期値。最初にどのトレーが入っているか分からないというような場合はUnknownと書く。
*PageSize Letter: "letter"
ページサイズです。" "内のものはキーワードじゃなく、このPS記述をRIPやプリンタに送るとそのサイズになるというものです。勿論ここの記述はRIPやプリンターによって違います。この辺りはPPDらしいですよね。
*PageSize Legal: "legal"
*PageSize Ledger: "ledger"
*PageSize Tabloid: "11x17"
*PageSize A3: "a3"
*PageSize A4: "a4"
この記述の場合、ページサイズをA4で出したい場合、a4 と書いておくだけでA4で出ます。
*PageSize A5: "a5"
*PageSize B5: "b5"
あ、*PageSizeや*PageRegion等はここでは使用している全てを太字(必須)にしていますが、当然1つあれば十分ですので。

*?PageSize: "
ページサイズが分からない時のRIPへの問い合わせ方法。" "内の記述をRIPやプリンタに送ると返答が返ってきます。ちなみにこの記述では、ページサイズの数値からどのページサイズか判別するような事をやっているようです。複数行なので最後に*Endがあります。
save
/d0 5 dict def d0 begin
/1224_792 (Ledger) def
end
/d1 7 dict def d1 begin
/596_420 (A5) def
/709_499 (B5) def
/792_612 (Letter) def
/842_596 (A4) def
/1008_612 (Legal) def
/1191_840 (A3) def
/1224_792 (Tabloid) def
end
statusdict begin pageparams end
4 1 roll pop
/high exch 10 string cvs dup length /hlen exch def def
/wide exch 10 string cvs def
/key hlen 1 add wide length add string def
key 0 high putinterval
key hlen (_) putinterval
key hlen 1 add wide putinterval
0 eq{d0}{d1}ifelse
key cvn{get}stopped{(Unknown)}if
= flush
restore
"
*End

*% These entries will set up the frame buffer. Usually used with manual feed.
*DefaultPageRegion: A4
ページサイズとほぼ同じ。印字可能領域から用紙サイズを選択する云々と説明にはありますが、RIPやプリンタによって*PageSizeと*PageRegionのどちらが有効かはまちまちなので、両方同じ事を書いておくのが一番いいです。
*PageRegion Letter: "letter"
*PageRegion Legal: "legal"
*PageRegion Note: "note"
*PageRegion Ledger: "ledger"
*PageRegion Tabloid: "11x17"
*PageRegion A3: "a3"
*PageRegion A4: "a4"
*PageRegion A5: "a5"
*PageRegion B5: "b5"

*% The following entries provide information about specific paper keywords.
*DefaultImageableArea: A4
*ImageableArea Letter: "0 1 612 792 "
その用紙サイズの中でどれだけのエリアに実際に印字出来るかという座標。左下を原点、右方向をX上方向をYとして、"左下X座標 左下Y座標 右上X座標 右上Y座標"。単位はポイント。
*ImageableArea Legal: "0 1 612 1008 "
*ImageableArea Ledger: "0 0 1223 792 "
*ImageableArea Tabloid: "0 1 792 1224 "
*ImageableArea A3: "0 1 840 1191 "
*ImageableArea A4: "0 1 596 842 "
*ImageableArea A5: "0 1 420 596 "
*ImageableArea B5: "0 1 499 709 "

*?ImageableArea: "
RIPやプリンタへの問い合わせのPS記述。
save /cvp { cvi ( ) cvs print ( ) print } bind def
newpath clippath pathbbox
4 -2 roll exch 2 {ceiling cvp} repeat
exch 2 {floor cvp} repeat flush
restore
"
*End

*% These provide the physical dimensions of the paper (by keyword)
*DefaultPaperDimension: A4
実際の用紙のサイズ。通常*PageSizeや*PageReegionと同じでOK。
*PaperDimension Letter: "612 792"
*PaperDimension Legal: "612 1008"
*PaperDimension Ledger: "1224 792"
*PaperDimension Tabloid: "792 1224"
*PaperDimension A3: "842 1190"
*PaperDimension A4: "595 842"
*PaperDimension A5: "420 595"
*PaperDimension B5: "516 729"

*% Custom Page Sizes
*CustomPageSize True: "
ユーザーが任意にページサイズを設定する時の記述なのですが、プリンタの場合はこの記述を書く必要なし(Falseではなく*CustomPageSize自体書かない)、RIP〜イメージセッタの場合はこのままで構わないと思います。
4 dict begin
pop % pop /Orientation value off the stack to fix bug in PageMaker 5.0
2 array astore /PageOffset exch def
2 array astore /PageSize exch def
/ImagingBBox null def
currentdict end setpagedevice"
*End
*ParamCustomPageSize Width: 1 points 72 14400
ページサイズの幅が72ポイントから14400ポイント。途中の1は呼び出される(使用される)順なので気にしないで下さい。
*ParamCustomPageSize Height: 2 points 72 14400
ページサイズの高さが72ポイントから14400ポイント。途中の2は使用される順なので気にしないで下さい。
*ParamCustomPageSize WidthOffset: 3 points 0 14400
ページサイズの幅のオフセット値(ロール紙の送り)が0ポイントから14400ポイント。
*ParamCustomPageSize HeightOffset: 4 points 0 14400
ページサイズの高さのオフセット値(ロール紙の送り)が0ポイントから14400ポイント。
*ParamCustomPageSize Orientation: 5 int 0 3
ページの回転。0から3。0が回転なし、1が反時計回りに90度、2が同180度、3が同270度。
*MaxMediaWidth: "86400"
用紙の幅の最大サイズ。単位ポイント。
*MaxMediaHeight: "86400"
用紙の高さの最大サイズ。単位ポイント。
*CenterRegistered: False
ロール紙の場合、印字を用紙の中心から行う(True)か端から行う(False)か。通常この記述は要りません。

*RequiresPageRegion All: True
プリンタがスロット(トレーなど)にセットされている用紙のページサイズを検出出来るかどうか。
上記は全てTrueですが、例えば
*RequiresPageRegion Upper: False
*RequiresPageRegion Lower: True
というように個別指定も出来ます。全部Falseなら当然 All: False で。

*OpenUI *InputSlot: PickOne
用紙スロットを1つ指定する。
*OrderDependency: 30 AnySetup *InputSlot
*DefaultInputSlot: Upper
デフォルトの用紙スロットを指定する。
*InputSlot Upper: "1 statusdict /setpapertray get exec"
*InputSlot Lower: "2 statusdict /setpapertray get exec"
*CloseUI: *InputSlot

*% Font Information =====================
*DefaultFont: Courier
指定されたフォントがない場合に使用されるフォント名。通常Courier.
*Font Courier: Standard "(002.004)" Standard ROM
RIPやプリンタに入っているフォントとバージョン等。仕様では必ず入っているもののみという事ですが、Windowsでフォントを指定する為にわざわざ書き加えて使用しているという方も数多くいます。
Standard: エンクリプションというものです。詳しく説明すると長くなるので、別のPPDを見てそれなりに書いて下さい(^^;
"()"内: フォントバージョン。例えば以下のようにして見つける事が出来ものもありますが、分からないもの、別の所の情報があるものもあります。
/Times-Roman findfont /FontInfo get /version get == flush
Standardは文字セットなのですが、これも他のPPDを見て下さい。
最後のROMは、もしROMではなくハードディスクに入っていれば Disk と書いて下さい。

*Font Courier-Bold: Standard "(002.004)" Standard ROM
*Font Courier-BoldOblique: Standard "(002.004)" Standard ROM
*Font Courier-Oblique: Standard "(002.004)" Standard ROM
*Font Helvetica: Standard "(001.006)" Standard ROM
*Font Helvetica-Bold: Standard "(001.007)" Standard ROM
*Font Helvetica-BoldOblique: Standard "(001.007)" Standard ROM
*Font Helvetica-Oblique: Standard "(001.006)" Standard ROM
*Font Times-Bold: Standard "(001.007)" Standard ROM
*Font Times-BoldItalic: Standard "(001.009)" Standard ROM
*Font Times-Italic: Standard "(001.007)" Standard ROM
*Font Times-Roman: Standard "(001.007)" Standard ROM
*Font Symbol: Special "(001.007)" Special ROM
*Font ZapfDingbats: Special "(001.004)" Special ROM

*?FontQuery: "
フォント名を探すPS記述です。このままでいいでしょう。テストをするならPS記述の前に (フォント名) を入れてRIPやプリンタに流して下さい。例えば (Times-Romsn) とか。
save
{ count 1 gt
{ exch dup 127 string cvs (/) print print (:) print
/Font resourcestatus {pop pop (Yes)} {(No)} ifelse =
} { exit } ifelse
} bind loop
(*) = flush
restore
"
*End

*?FontList: "
フォント名一覧を返すPS記述です。この" "の中をそのままRIPやプリンタに送るとフォント名が返ってきます。
save
(*) {cvn ==} 128 string /Font resourceforall
(*) = flush
restore
"
*End

*% Printer Messages (verbatim from printer):
*Message: "%%[ exitserver: permanent state may be changed ]%%"
*Message: "%%[ Flushing: rest of job (to end-of-file) will be ignored ]%%"
*Message: "\FontName\ not found, using Courier"
デバイスメッセージのリストという事ですが、私には書く意味がよく分かりません(^^;

*% Color Separation Information =====================

*DefaultColorSep: ProcessBlack.133lpi.2400dpi/133 lpi / 2400 dpi
デフォルトの線数角度設定。プリンタドライバにPPDを設定すると、これ以下の設定のリストの内容が表示され、その中で上記のデフォルト値がまず最初に出てきています。

*% For 133 lpi / 2400 dpi ==============================================

*ColorSepScreenAngle ProcessBlack.133lpi.2400dpi/133 lpi / 2400 dpi: "45.0"
*ColorSepScreenAngle CustomColor.133lpi.2400dpi/133 lpi / 2400 dpi: "45.0"
*ColorSepScreenAngle ProcessCyan.133lpi.2400dpi/133 lpi / 2400 dpi: "15.0"
*ColorSepScreenAngle ProcessMagenta.133lpi.2400dpi/133 lpi / 2400 dpi: "75.0"
*ColorSepScreenAngle ProcessYellow.133lpi.2400dpi/133 lpi / 2400 dpi: "0.0"

*ColorSepScreenFreq ProcessBlack.133lpi.2400dpi/133 lpi / 2400 dpi: "133.0"
*ColorSepScreenFreq CustomColor.133lpi.2400dpi/133 lpi / 2400 dpi: "133.0"
*ColorSepScreenFreq ProcessCyan.133lpi.2400dpi/133 lpi / 2400 dpi: "133.0"
*ColorSepScreenFreq ProcessMagenta.133lpi.2400dpi/133 lpi / 2400 dpi: "133.0"
*ColorSepScreenFreq ProcessYellow.133lpi.2400dpi/133 lpi / 2400 dpi: "133.0"
線数角度の設定です。基本は、
*ColorSepScreenAngle(又はFreq) キーワード "値"
なのですが、キーワードが カラーの名前.線数.角度 そして更に線数と解像度のオプションがついているので、見た目には少々ややこしいかも。でもまあ何も考えず、こんな感じに書けばOKです。


*% For 150 lpi / 2400 dpi ==============================================

*ColorSepScreenAngle ProcessBlack.150lpi.2400dpi/150 lpi / 2400 dpi: "45.0"
*ColorSepScreenAngle CustomColor.150lpi.2400dpi/150 lpi / 2400 dpi: "45.0"
*ColorSepScreenAngle ProcessCyan.150lpi.2400dpi/150 lpi / 2400 dpi: "15.0"
*ColorSepScreenAngle ProcessMagenta.150lpi.2400dpi/150 lpi / 2400 dpi: "75.0"
*ColorSepScreenAngle ProcessYellow.150lpi.2400dpi/150 lpi / 2400 dpi: "0.0"

*ColorSepScreenFreq ProcessBlack.150lpi.2400dpi/150 lpi / 2400 dpi: "150.0"
*ColorSepScreenFreq CustomColor.150lpi.2400dpi/150 lpi / 2400 dpi: "150.0"
*ColorSepScreenFreq ProcessCyan.150lpi.2400dpi/150 lpi / 2400 dpi: "150.0"
*ColorSepScreenFreq ProcessMagenta.150lpi.2400dpi/150 lpi / 2400 dpi: "150.0"
*ColorSepScreenFreq ProcessYellow.150lpi.2400dpi/150 lpi / 2400 dpi: "150.0"

*% For 175 lpi / 2400 dpi ==============================================

*ColorSepScreenAngle ProcessBlack.175lpi.2400dpi/175 lpi / 2400 dpi: "45.0"
*ColorSepScreenAngle CustomColor.175lpi.2400dpi/175 lpi / 2400 dpi: "45.0"
*ColorSepScreenAngle ProcessCyan.175lpi.2400dpi/175 lpi / 2400 dpi: "15.0"
*ColorSepScreenAngle ProcessMagenta.175lpi.2400dpi/175 lpi / 2400 dpi: "75.0"
*ColorSepScreenAngle ProcessYellow.175lpi.2400dpi/175 lpi / 2400 dpi: "0.0"

*ColorSepScreenFreq ProcessBlack.175lpi.2400dpi/175 lpi / 2400 dpi: "175.0"
*ColorSepScreenFreq CustomColor.175lpi.2400dpi/175 lpi / 2400 dpi: "175.0"
*ColorSepScreenFreq ProcessCyan.175lpi.2400dpi/175 lpi / 2400 dpi: "175.0"
*ColorSepScreenFreq ProcessMagenta.175lpi.2400dpi/175 lpi / 2400 dpi: "175.0"
*ColorSepScreenFreq ProcessYellow.175lpi.2400dpi/175 lpi / 2400 dpi: "175.0"

*% Last Edit Date: Nov 26, 01 by Sera
*% End of PPD file for SeraPrinter123
メニューページに戻る