DOBON.NET DOBON.NETプログラミング掲示板過去ログ

プリンタのユーザ定義ファイルのセットの仕方を教えてください

環境/言語:[Windows Vista/7 VS2005 C#]
分類:[.NET]

プリンタのユーザ定義ファイルのセットの仕方を教えてください。

下記のようにしてみましたが、プリンタ側は、プリンタのプロパティで登録されているA4のままになります。

PaperSize pkCustom = new PaperSize("Custom 297 x 148 mm", (int)(2970 * 100 / 25.4), (int)(2970 * 100 / 25.4));
foreach (PaperSize ps in pd.PrinterSettings.PaperSizes)
{
if (ps.Kind == PaperKind.Custom)
  {
pd.DefaultPageSettings.PaperSize = (PaperSize)pkCustom;
printDoc.DefaultPageSettings.PaperSize = (PaperSize)pkCustom;
break;
}
}
上記のとおりでは、ユーザー定義はセットできないのですか?


参考にしたページ(VS2008用のコードのようですがVS2005で使いたい)
http://www.geocities.jp/gakaibon/tips/csharp2008/print-custompapervalid.html
http://www.geocities.jp/gakaibon/tips/csharp2008/print-custompaperinvalid.html
2011/03/01(Tue) 16:12:12 編集(投稿者)

■No28267に返信(esuさんの記事)
> プリンタのユーザ定義ファイルのセットの仕方を教えてください。
プリンタドライバーによって、
 (1) そもそも、ユーザー定義サイズに対応していない物
 (2) 事前に OS 側の設定でカスタム用紙サイズを定義しておき、
  それをプリンターに指示するタイプの物
 (3) ユーザー定義用紙を選択したうえで、幅と高さを指定するタイプの物
 (4) (2)と(3)の両方に対応しているもの
 (5) DEVMODE 構造体の私用領域に追加の設定を必要とする物
などがあります。

(3) の場合の指定例。
http://www.gizcollabo.jp/vbtomo/boards/vbqanda.php?do=spread&num=14735


> 上記のとおりでは、ユーザー定義はセットできないのですか?
出来る物とできない物とがあります。

まず、PrintDialog + PrintDocument 経由での印刷処理を行い、そこから
手動でユーザー定義サイズを指定して、目的の印刷が行えるかどうかを
確認してみてください。ここで失敗するようだと、コードでも指定できないかも。

PrintDialog 経由なら印刷できるなら、そのときの PaperKind 値がどのように
設定されているかを確認し、さらに今度は PrintDialog 無しで同様の値を
設定して、目的の印刷が行えるかどうかを試してみては如何でしょう。
■No28270に返信(魔界の仮面弁士さんの記事)
> 2011/03/01(Tue) 16:12:12 編集(投稿者)

>>上記のとおりでは、ユーザー定義はセットできないのですか?
> 出来る物とできない物とがあります。
> PrintDialog 経由なら印刷できるなら、そのときの PaperKind 値がどのように

上記のとおり行い調べてみました。
すると、印刷可能で kind=Custom, RawKind=256 となっていました。
私のコードで同じく調べると kind=Custom, RawKind=0 でありRawKind 値をセットすることにより上記のまま印刷する用になりました。

ただ、疑問として、プリンタの不定形が標準では、10ちょっと形式をもっています、1つ目は、サイズが(787×787)でそれ以降全て(1169×827)でした。

これは、「事前にプリンタに用紙サイズをセットしておけ」という解釈でよろしいのですか?

そこにあるサイズをアプリで作成して送れば印刷できる?という解釈でいいにでしょうか?

教えてください。
参考ページ作者の雅階凡です。
実は、現在 Windows から Linux (ubuntu) に移行してしまったものですから、
手元で試すことができませんが次のような事が考えられると思います。

> PaperSize pkCustom = new PaperSize("Custom 297 x 148 mm", (int)(2970 * 100 / 25.4), (int)(2970 * 100 / 25.4));

これですと 297 cm x 297 cm の用紙サイズを対象にすることになると思いますが、
単位や用紙サイズに間違いはありませんでしょうか?

> if (ps.Kind == PaperKind.Custom)

この部分が問題になると思います。
PaperKind.A4 や PaperKind.B5 等の値と比較すする分には問題ありませんが、
カスタムサイズと直接の比較は出来なかったように思いますし、
このような比較では問題解決ができなかったと記憶しています
(今となっては確認しようがないので定かではありません)。
この場合は ps.Width, ps.Height と pkCustom.Width, pkCustom.Height を比較すべきだと思います。
また、問題解決が出来る出来ない以前に、この場合だと
    if (ps.Kind ==  pkCustom)
のように記述すべきではないかと思います...
もちろん比較対象を ps.Width 等に変更すべきですが...
手元で試すことが出来ませんので何とも言えませんがデバッグを実行することが出来たのでしょうか?
仮に出来たとしても何の意味ももたないと思いますが...

お尋ねの場合には、事前にプリンタ側でユーザー定義サイズとしてカスタムサイズを
登録する事が必要だと思いますのでそれがなされていることを確認してください。

プリンタ側で定義されていないカスタムサイズをプログラム内で利用しようとするとプリンタにダメージを与える事も含め、
他にも様々な事をクリアする事が必要になると思います
(やって出来ないことはないと思いますがお薦めはできません)。

VS2005 でも同様だと思いますので、
<http://www.geocities.jp/gakaibon/tips/csharp2008/print-custompapervalid.html> 
のサンプルコード内の下記のあたりを中心として
関連する所の用紙サイズのみを変更の上デバッグしてみることをお薦めします。

        //
        // プリンタで定義済みの Bible サイズ ( 95 x 171 mm )を作成.
        //   ( PaperSize の Kind プロパティは Custom になります )
        //
        szBible = new PaperSize("Bible 95 x 171 mm",
                                (int)( 95 * 100 / 25.4),
                                (int)(171 * 100 / 25.4));

追記:場合によっては小数点以下の処理を変える必要があるかもしれませんが...

DOBON.NET | プログラミング道 | プログラミング掲示板