C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

印刷の設定方法

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■86315 / inTopicNo.1)  印刷の設定方法
  
□投稿者/ 夜叉丸 (89回)-(2018/01/17(Wed) 13:51:45)

分類:[.NET 全般] 

プリンターの印刷を行う場合に

PrintGrid を使用して PrintGrid("一覧表", PrintGridFlags.FitToPage) としています。

印刷のカラー設定を以下のように設定して白黒印刷で行いたいのですが
PrintParameters.PrintDocument.DefaultPageSettings.Color = false;
PrintParameters.PrintDocument.PrinterSettings.DefaultPageSettings.Color = false;

カラーで印刷されてしまいます。

試しに
PrintGrid("一覧表", PrintGridFlags.FitToPage | PrintGridFlags.ShowPrintDialog)
でダイアログを確認するとカラーの設定になっています。
PrintParameters.PrintDocument.PrinterSettings.Copies = 2;
にすると印刷部数は2に代わります。

プリンターの設定ダイアログでは
カラー(自動判別)/白黒/2色カラー(赤・黒)
の3種類になっています。
なので、true,false 以外になにか設定しないといけないのでしょうか?


引用返信 編集キー/
■86332 / inTopicNo.2)  Re[1]: 印刷の設定方法
□投稿者/ Jitta (356回)-(2018/01/19(Fri) 14:25:08)
No86315 (夜叉丸 さん) に返信
> プリンターの印刷を行う場合に
>
> PrintGrid を使用して PrintGrid("一覧表", PrintGridFlags.FitToPage) としています。
>
> 印刷のカラー設定を以下のように設定して白黒印刷で行いたいのですが
> PrintParameters.PrintDocument.DefaultPageSettings.Color = false;
> PrintParameters.PrintDocument.PrinterSettings.DefaultPageSettings.Color = false;
>

なぜDefaultPageSettings?



> カラー(自動判別)/白黒/2色カラー(赤・黒)
> の3種類になっています。
> なので、true,false 以外になにか設定しないといけないのでしょうか?
>
プリンタドライバに依存します。
引用返信 編集キー/
■86338 / inTopicNo.3)  Re[2]: 印刷の設定方法
□投稿者/ Jitta (357回)-(2018/01/20(Sat) 09:48:09)
プリンターのプロパティを開いて、
Windows 10 の場合、設定→デバイス→プリンターとスキャナー→対象のプリンター→管理→プリンターのプロパティ→詳細設定→印刷後ドキュメントを残す
をチェックします。
印刷後に、%SYSTEMROOT%\System32\spool\PRINTERSに(管理者権限が必要) .shd ファイルがあります。ここに、実際に印刷したときの設定が入っています。
SHDファイルのフォーマットは http://www.undocprint.org/formats/winspool/shd のあたりを参照。
最近のだと、シグニチャに SHD_SIGNATURE_WIN2012 があるはずなので、シグニチャの部分は違っているかも。
また、ぱっと見ただけでは32ビットと64ビットの区別が付きません。64ビットの場合、offset の DWORD が QWORD になっているので注意。
この中で、offDevMode の値が、印刷時の設定を記録しているアドレスです。この値まで、ファイルを読み飛ばします。
その後、https://msdn.microsoft.com/en-us/library/windows/desktop/dd183565.aspx の DEVMODE 構造体が入っているので、読み取り、dmColor を確認します。
この値自体は DMCOLOR_COLOR か、DMCOLOR_MONOCHROME のどちらかのはずです。しかし、プリンターが独自の設定を持っているなら、dmDriverExtra に記録されている場所以降にある設定が有効です。これはメーカー独自のフォーマットなので、わかりません。

引用返信 編集キー/
■86381 / inTopicNo.4)  Re[3]: 印刷の設定方法
□投稿者/ 夜叉丸 (90回)-(2018/01/24(Wed) 12:23:09)
No86338 (Jitta さん) に返信

SHDファイルが作成されました。
バイナリファイルですよね。
中身がわかりませんでした。
引用返信 編集キー/
■86382 / inTopicNo.5)  Re[4]: 印刷の設定方法
□投稿者/ Jitta (358回)-(2018/01/24(Wed) 21:53:08)
No86381 (夜叉丸 さん) に返信
> ■No86338 (Jitta さん) に返信
>
> SHDファイルが作成されました。
> バイナリファイルですよね。
> 中身がわかりませんでした。

いや、だから、書いてるやん。

SHDファイルのフォーマットは http://www.undocprint.org/formats/winspool/shd のあたりを参照。
最近のだと、シグニチャに SHD_SIGNATURE_WIN2012 があるはずなので、シグニチャの部分は違っているかも。
また、ぱっと見ただけでは32ビットと64ビットの区別が付きません。64ビットの場合、offset の DWORD が QWORD になっているので注意。
この中で、offDevMode の値が、印刷時の設定を記録しているアドレスです。この値まで、ファイルを読み飛ばします。
その後、https://msdn.microsoft.com/en-us/library/windows/desktop/dd183565.aspx の DEVMODE 構造体が入っているので、読み取り、dmColor を確認します。
この値自体は DMCOLOR_COLOR か、DMCOLOR_MONOCHROME のどちらかのはずです。しかし、プリンターが独自の設定を持っているなら、dmDriverExtra に記録されている場所以降にある設定が有効です。これはメーカー独自のフォーマットなので、わかりません。
引用返信 編集キー/
■86385 / inTopicNo.6)  Re[4]: 印刷の設定方法
□投稿者/ 魔界の仮面弁士 (1549回)-(2018/01/25(Thu) 11:26:37)
No86315 (夜叉丸 さん) に返信
> PrintGrid を使用して PrintGrid("一覧表", PrintGridFlags.FitToPage) としています。
PrintGrid って、下記のことですよね。
http://c1.grapecity.com/help/web/winforms/winforms_flexgrid/C1.Win.C1FlexGrid.4~C1.Win.C1FlexGrid.C1FlexGridBase~PrintGrid%28String%2cPrintGridFlags%29.html

FlexGrid / ComponentOne Studio に関する技術的な相談なら、
GrapeCity のサポートに問い合わせた方が良いのでは…?
https://www.grapecity.co.jp/developer/support/technical



No86381 (夜叉丸 さん) に返信
> SHDファイルが作成されました。
> バイナリファイルですよね。

TSXBIN や Stirling といった、構造体の表示に対応した
バイナリエディターを利用すると、解析が楽になるかも知れません。
(といっても、構造体表示のためには定義ファイルを自作する必要があるのですが)


> 中身がわかりませんでした。
http://www.undocprint.org/formats/winspool/shd
https://www.codeproject.com/Articles/9720/The-Windows-NT-print-spool-shadow-file-format


まずは .SHD ファイルの先頭 4 バイトを判断。DWORD dwSignature の部分です。
これが、Jitta さんが述べられた 「シグネチャ(シグニチャ)」に当たります。
>> 最近のだと、シグニチャに SHD_SIGNATURE_WIN2012 があるはずなので、シグニチャの部分は違っているかも。


提示の資料によれば、その値は

68,49,00,00 (0x00004968) なら Windows 2003 フォーマット
67,49,00,00 (0x00004967) なら Windows 2000/XP フォーマット
66,49,00,00 (0x00004966) なら Windows NT フォーマット
4B,49,00,00 (0x0000494B) なら Windows 98 フォーマット

だそうです。ここに無いシグネチャの場合は……私も分かりません。(^^;;

参考までに、手元の環境で実験したところ、
 Server 2012 … 68,49,00,00(0x00004968)
 Windows 7  … 23,51,00,00(0x00005123)
 Win10(1709) … 23,51,00,00(0x00005123)
になっていました。

これにより構造体の種類が分かるので、対応するものを探します。
たとえば 67,49,00,00 あるいは 68,49,00,00 なら、
SHADOW_FILE_HEADER_WIN2000 を参照することになります。


次に問題となるのが、32bit/64bit の判定。

メンバー名の先頭が off で始まるエントリーは、先の資料では DWORD と書かれていますが、
これは C# でいうところの IntPtr 型メンバーであり、実際には構造体のオフセットを示しています。

>> ぱっと見ただけでは32ビットと64ビットの区別が付きません。64ビットの場合、offset の DWORD が QWORD になっているので注意。

たとえば、SHADOW_FILE_HEADER_WIN2000 フォーマットであった場合で言えば、
まずは 32bit フォーマットと仮定して、構造体先頭 20 バイトを読み捨てて、
 DWORD offUserName;   // オフセット[0x0014〜0x0017]
 DWORD offNotifyName;  // オフセット[0x0018〜0x001B]
 DWORD offDocumentName; // オフセット[0x001C〜0x001F]
の位置にある、4 バイトデータ 3 つを読み取っていきます。

この時、offUserName と offDocumentName が ゼロを指していて、
offNotifyName だけに値が入っている場合、このデータは
32bit フォーマットではなく、64bit の可能性が高いので、
 QWORD offUserName;   // オフセット[0x0014〜0x001B]
 QWORD offNotifyName;  // オフセット[0x001C〜0x0023]
 QWORD offDocumentName; // オフセット[0x0024〜0x002B]
に読みかえます。

32bit/64bit どちらの場合でも、これらの値は、
構造体サイズよりも小さな値を指し示すはずです。
(構造体から溢れる値が示されているようなら、解析失敗ということで)


これらのここで示された値は、「構造体の先頭からの相対位置」なので、
そこにあるバイナリを文字列として読み取ります。恐らくは
32bit なら Shift_JIS 相当、64bit なら UTF-16 相当でしょう。

その文字列を目視確認してみて、ユーザー名・通知名・文書名に相当する
内容が書き込まれているようなら、ここまでの解析は成功しているはず。


ここまでで、32bit/64bit のいずれになるのかを判定できたら、
>> この中で、offDevMode の値が、印刷時の設定を記録しているアドレスです。この値まで、ファイルを読み飛ばします。
に進み、DEVMODE 構造体を取り出します。

DEVMODE 構造体の先頭部、すなわち offDevMode が指し示すオフセットアドレスには、
 TCHAR dmDeviceName[CCHDEVICENAME];
があるので視認しやすいかと思います。
ここにあるのはプリンタ名を示した 32 文字の固定長文字列であり、
先ほどと同様、32bit なら Shift_JIS 相当、64bit なら UTF-16 相当です。



>> DEVMODE 構造体が入っているので、読み取り、dmColor を確認します。
>> この値自体は DMCOLOR_COLOR か、DMCOLOR_MONOCHROME のどちらかのはずです。

64 bit 版の .SHD の場合は、「offDevMode の値 + 0x5C」の場所からの 2 バイトを読み取ります。
∵ 64bit 版 DEVMODE では 92 バイト目が「short dmColor」

32bit 版の .SHD の場合は、「offDevMode の値 + 0x3C」の場所からの 2 バイトを読み取ります。
∵ 32bit 版 DEVMODE では 60 バイト目が「short dmColor」


ちなみに
 DMCOLOR_MONOCHROME = 0x0001
 DMCOLOR_COLOR = 0x0002
です。
引用返信 編集キー/
■86434 / inTopicNo.7)  Re[5]: 印刷の設定方法
□投稿者/ Jitta (359回)-(2018/01/29(Mon) 08:37:56)
No86385 (魔界の仮面弁士 さん) に返信
> 32bit/64bit どちらの場合でも、これらの値は、
> 構造体サイズよりも小さな値を指し示すはずです。
> (構造体から溢れる値が示されているようなら、解析失敗ということで)

フォローありがとうございます。

ここですが、構造体より大きく、ファイルサイズより小さい値だったと思います。
引用返信 編集キー/
■86463 / inTopicNo.8)  Re[6]: 印刷の設定方法
□投稿者/ 夜叉丸 (91回)-(2018/01/31(Wed) 14:32:04)
2018/01/31(Wed) 14:33:10 編集(投稿者)
とりあえず自分の環境(Winodows10 64bit pro)で確認してみました。

バイナリエディタで開くと以下のように表示されました。
先頭は 23,51,00,00 なので Win10 でした。
なので、フォーマットがわかりません。

     0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
000  23 51 00 00 E0 00 00 00 80 04 28 00 0F 00 00 00
010  01 00 00 00 00 00 00 00 C0 08 00 00 00 00 00 00
020  CE 08 00 00 00 00 00 00 DC 08 00 00 00 00 00 00
030  00 00 00 00 00 00 00 00 EC 08 00 00 00 00 00 00
040  10 09 00 00 00 00 00 00 E0 00 00 00 00 00 00 00
050  3A 09 00 00 00 00 00 00 4C 09 00 00 00 00 00 00
060  00 00 00 00 00 00 00 00 E2 07 01 00 03 00 18 00
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

引用返信 編集キー/
■86465 / inTopicNo.9)  Re[7]: 印刷の設定方法
□投稿者/ PANG2 (210回)-(2018/01/31(Wed) 15:37:22)
「白黒印刷」に設定したプリンターをOSに登録するのが手っ取り早いようです。

http://bbs.wankuma.com/index.cgi?mode=al2&namber=69301&KLOG=118
引用返信 編集キー/
■86525 / inTopicNo.10)  Re[8]: 印刷の設定方法
□投稿者/ 夜叉丸 (92回)-(2018/02/08(Thu) 15:14:11)
最初のやり方だと、プリンターが変更するたびに
データを調査しないと印刷できなくなるし、
使用するプリンターが不明のためデータを作成することが困難だと思います。

そこで、
デバイスとプリンターにて
プリンターのデバイスをもう一つ追加して
カラー用と白黒用を作成し、使用するデバイス名を指定して印刷するようにしました。


手順としては
1.既定のプリンターと同じプリンターの追加をおこなって、
2.出来上がったほうの印刷設定にて白黒に変更する。
3.アプリケーションのほうで、出来上がったほうの印刷設定のデバイス名を登録しておく
4.アプリケーションではカラー以外の設定はうまく動作してくれるので指定して印刷する。

にて対応することにしました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ