用紙の向きと余白の関係
紙の向きにより余白の上下左右の解釈が変わります。見方によっては変わらないとも言えます。この連載で説明する方法では文字や画像の印刷位置は余白の大小の影響を受けませんから、ほとんど気にする必要はありません。とはいえ、余白部分はマスクされて描画されないので、10mmとか、5mmとか小さめにMediaPrintableAreaの設定をしておくのがいいでしょう。
これで良ければ、この項の残り部分は読まずに、「PrinterJobで用紙サイズや余白を指定する印刷の実例」の項に進んでしまって構いません。横置きにすると左余白は上余白になるのか、下余白になるのか、左余白のままなのかという面倒なことを一応説明します。全部10.0fにしておけばどうだっていいのですが。
OrientationRequested説明文(API仕様)のフィールドの詳細でLANDSCAPEの項には、
「コンテンツは媒体上に横長に印刷されます。ランドスケープ・モードは、出力ストリーム・ページを媒体に対してポートレート・モードから90度反時計回りに回転する操作として定義されます。注: 90度反時計回りとして定義されるのは、長辺に対する仕上げ処理をポートレート・モードとランドスケープ・モードで共通にし、単純化するためです。」
とあります。
長辺に対する仕上げ処理とは例えば綴るなら縦長なら左、横長なら上ということでしょうか。短辺を綴るなら縦長なら上、横長なら左でこれを共通にするなら90度時計回りが都合が良いとなるので、根拠としては弱い気もします。でも定義では「媒体に対して90度反時計回り」です。
MediaPrintableAreaの説明文(API仕様)には、
「矩形の印刷可能領域を決定する場合、要求しているコンテキスト内で指定されている方向に関わらず、ポートレート・モードで印刷する場合の用紙の左上位置が原点となり、その座標(x,y)が設定されます。たとえばA4サイズ用紙の印刷可能領域は、ポートレート・モードおよびランドスケープ・モードのどちらの場合でも、高さが幅より大きくなります。 」
とあります。
要するに、どんな時も縦を長くする向きに置いて考えるんだよということです。
上記のプログラムで余白を変更して試してみます(後に全体のプログラムを提示します)。
float L = 10.1f; float R = 20.2f; float T = 10.3f; float B = 20.4f;
PORTRAIT(縦置き)では次のような余白になります。
これをこのままLANDSCAPE(横置き)指定にすると、「反時計回りに90度回転」ですから、
「ポートレート・モードで印刷する場合の用紙の左上位置が原点」となり、「媒体に対してポートレート・モードから90度反時計回りに回転する」ので、余白の幅は変化せず、印刷されるドキュメントが回転します。回転したドキュメントにとっては、Lが上余白、Bが左余白になります。
この辺の事情は、Linux、Windowsともに同じです。出来上がる印刷物の余白の大きさも同じです。ただ、LinuxとWindowsでは紙送りの向き、つまりプリンタから出てくる時の向きが逆になります。Windowsの場合、プリンタから先に出てくる辺がTopと考えてしまうと、とても混乱します。
印刷ダイアログです。まずはPORTRAIT。「用紙の向き」の項で縦が選択され、プログラムのL,R,T,Bがきちんと反映されています。
これをこのままLANDSCAPE(横置き)指定にすると、「用紙の向き」の項で横が選択され、プログラムのL,R,T,Bが、上,下,右,左になります。上で考察した「Lが上余白、Bが左余白」に合致します。
REVERSE_LANDSCAPEの場合は、「用紙の向き」の項でランドスケープ(反転)が選択され、プログラムのL,R,T,Bが、下,上,左,右になります。ポートレート・モードから90度時計回りに回転した状態に合致します。