- PR -

ASP.NETでクライアントの利用するプリンタの設定を変更したい

投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2008/03/13
投稿数: 22
投稿日時: 2008-05-14 15:43
こんにちは。教えてください。

ASPで帳票を作成しています。
印刷はクライアントサイドでJavaScriptのwindow.print()で行っているのですが、プリンタの設定をサーバーで操作したいのです。

クライアントが利用するプリンタは、サーバーからアクセスできるように共有設定してあるので、プリンタへのアクセスはできるのですが、Webで適当に探して設定しているのですが、いまいち設定の変更の仕方がわかりません。

とりあえず以下はデフォルトのプリンタの用紙の向きを変更しているつもりですが、うまくいきません。

Public Class PrinterSetting
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
Public Structure DEVMODE
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
Public dmDeviceName As String
Public dmSpecVersion As Short
Public dmDriverVersion As Short
Public dmSize As Short
Public dmDriverExtra As Short
Public dmFields As Integer
Public dmOrientation As Short
Public dmPaperSize As Short
Public dmPaperLength As Short
Public dmPaperWidth As Short
Public dmScale As Short
Public dmCopies As Short
Public dmDefaultSource As Short
Public dmPrintQuality As Short
Public dmColor As Short
Public dmDuplex As Short
Public dmYResolution As Short
Public dmTTOption As Short
Public dmCollate As Short
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32 )> _
Public dmFormName As Short
Public dmLogPixels As Short
Public dmBitsPerPel As Short
Public dmPelsWidth As Integer
Public dmPelsHeight As Integer
Public dmDisplayFlags As Integer
Public dmDisplayFrequency As Integer
Public dmICMMethod As Integer
Public dmICMent As Integer
Public dmMediaType As Integer
Public dmDitherType As Integer
Public dmReserved1 As Integer
Public dmReserved2 As Integer
Public dmPanningWidth As Integer
Public dmPanningHeight As Integer
End Structure

<DllImport("kernel32.dll")> _
Shared Function GlobalFree(ByVal hMem As IntPtr) As IntPtr
End Function
<DllImport("kernel32.dll")> _
Shared Function GlobalLock(ByVal hMem As IntPtr) As IntPtr
End Function
<DllImport("kernel32.dll")> _
Shared Function GlobalUnlock(ByVal hMem As IntPtr) As Boolean
End Function

Public Sub New()
Dim PP As New Printing.PrinterSettings
Dim Mem As IntPtr = PP.DefaultPageSettings.PrinterSettings.GetHdevnames
Dim DevMem As IntPtr = PrinterSetting.GlobalLock(Mem)
Dim Dev As DEVMODE = CType(Marshal.PtrToStructure(DevMem, GetType(PrinterSetting.DEVMODE)), DEVMODE)
Dev.dmOrientation = 2''これで横向きになるんでないの?????
Marshal.StructureToPtr(Dev, DevMem, True)
PrinterSetting.GlobalUnlock(Mem)
PP.DefaultPageSettings.PrinterSettings.SetHdevmode(Mem)
PrinterSetting.GlobalFree(Mem)
End Sub
End Class

お分かりになる方、どうぞ教えてください。よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-05-14 18:01
そのコードは、いつ、何処で動いて、どこにあるプリンタの設定を変更しているのでしょう?

ってのを、よーく考えると、何故変更されないか、分かります。


で、目的のことは、まず出来ません。そのコードを active X として配布し、スクリプトから操作すれば、出来るようになります。


その他の方法として、CSS でなんとか出来ると思います。これが正攻法でしょう。
未記入
常連さん
会議室デビュー日: 2008/03/13
投稿数: 22
投稿日時: 2008-05-14 18:22
返信ありがとうございます。

ご指摘のことは、サーバーとクライアントについてのことかと思うのですが、サーバーからアクセスできるようにしたプリンタもだめなのでしょうか?できるような気がしてしまいましたが、違うのかな。またはもっと別のところのご指摘なのでしょうか?

また、サーバー、クライアントに限らず、現状のコードはちゃんと動作しません。う〜ん、問題がいっぱいです。

でもCSSでできるんですね、知りませんでした。こっちは調べてみます。ありがとうございます(でも、引き続きご指摘をいただけると助かります。。。すみません)。

よろしくお願いします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-05-15 00:00
cssでの印刷時のスタイル設定はこんな感じです。
http://allabout.co.jp/internet/hpcreate/closeup/CU20050728A/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-05-15 22:18
 サーバのプリンタに設定できないのは、dmFields を設定していないから、ではないかな?
プリンタから設定を引っ張ってきて、dmOrientation だけ変えていますが、これは union の中にあります。ここをどう解釈するかを、dmFields で指定してあげないといけないのでは?
(ざっと見ると、union の箇所を一つしか定義していないので、union がどういうものか理解されていると判断しました。)


 「サーバーからアクセスできるようにした」から、なぜ変えられると思ったのでしょう?
ああ、「サーバの設定を変えるのだから、それを参照しているクライアントも変わるのでは?」という意味ですか?確かにそうですね。

 では、サーバの OS 種類はなんでしょう?そのサーバで、ASP.NET のワーカープロセスに、プリンタの設定変更権があるでしょうか。セキュリティ例外が発生していると思います。発生していないなら、なんだろ???

 今、Virtual PC からホスト上のプリンタを参照してみましたが、印刷設定は別々に持つみたいですね。1面2ページ設定しているプリンタを参照しましたが、Virtual PC では1面1ページになっています。このことから、サーバの設定を変えられても、クライアントから印刷されるものを変えられないのではないかと思います。


[ メッセージ編集済み 編集者: Jitta 編集日時 2008-05-15 22:21 ]
未記入
常連さん
会議室デビュー日: 2008/03/13
投稿数: 22
投稿日時: 2008-05-16 12:49
べるさん、Jittaさんお返事ありがとうございます!!
返事が遅くなってしまいました(機能は別の問題で絶望しておりました)。

○べるさん
参考のURLありがとうございます!!助かります!!CSSでできる範囲のことは、CSSでしっかりやろうと思います。ご提示のURLで勉強したいと思います!

○Jittaさん
-------------------------------
 サーバのプリンタに設定できないのは、dmFields を設定していないから、ではないかな?
プリンタから設定を引っ張ってきて、dmOrientation だけ変えていますが、これは union の中にあります。ここをどう解釈するかを、dmFields で指定してあげないといけないのでは?
(ざっと見ると、union の箇所を一つしか定義していないので、union がどういうものか理解されていると判断しました。)
--------------------------------
おっしゃるとおり、全然理解してないです。すみません、自分でも調べているのですかなかなか参考になるサイトが見つかりませんで、可能であればご教授願えませんでしょうか?

---------------------------------
 では、サーバの OS 種類はなんでしょう?そのサーバで、ASP.NET のワーカープロセスに、プリンタの設定変更権があるでしょうか。セキュリティ例外が発生していると思います。発生していないなら、なんだろ???
----------------------------------
発生していないのは、デバッグでやっているからです。サーバー、クライアントの前に、プリンタの設定を変えるコードを書くところで挫折している感じでした。ちなみに、プリンタの設定変更はIUSR_コンピュータ名のユーザーではできないでしょうか。じゃあ諦めないと駄目ですね。


---------------------------------------
 今、Virtual PC からホスト上のプリンタを参照してみましたが、印刷設定は別々に持つみたいですね。1面2ページ設定しているプリンタを参照しましたが、Virtual PC では1面1ページになっています。このことから、サーバの設定を変えられても、クライアントから印刷されるものを変えられないのではないかと思います。
---------------------------------------
今LANでつないだ二台のパソコンで、プリンタを共有していますが、1台からプリンタの設定を変更すると、もう一台のPCで印刷するときその設定が反映されています。以前試して、こういうことできるんだと思って、今回のことを思い立った感じです。

色々無知でどうしようもない感じです。
未記入
常連さん
会議室デビュー日: 2008/03/13
投稿数: 22
投稿日時: 2008-05-16 13:02
というか、プリンタの設定自体は、個別にセキュリティの設定でEveryoneに許可を与えてあげればOKだったりしますでしょうか?OKだったら、最高です!
未記入
常連さん
会議室デビュー日: 2008/03/13
投稿数: 22
投稿日時: 2008-05-16 13:18
度々すみません、今気になってプリンタの設定の変更二台のPCでやってみたら、駄目でした。アレ?この前のはなんだったんだ。すみませんでした。

スキルアップ/キャリアアップ(JOB@IT)