none
Printerの印刷品質と用紙種類を取得設定したい RRS feed

  • 質問

  • Printerの印刷品質と用紙種類を取得設定したいと思っています。

            Dim printQueue As PrintQueue = Nothing
            Dim localPrintServer As New LocalPrintServer()
            ' Retrieving collection of local printer on user machine
            Dim localPrinterCollection As PrintQueueCollection = localPrintServer.GetPrintQueues()
            Dim localPrinterEnumerator As System.Collections.IEnumerator = localPrinterCollection.GetEnumerator()

            Do Until Not localPrinterEnumerator.MoveNext
                ' Get PrintQueue
                printQueue = CType(localPrinterEnumerator.Current, PrintQueue)
                ' Get default PrintTicket from printer
                Dim printTicket As PrintTicket = printQueue.DefaultPrintTicket
                Debug.WriteLine(printQueue.FullName, "printQueue.FullName")
                Debug.WriteLine(printTicket.OutputQuality, "printTicket.OutputQuality")
                Debug.WriteLine(printTicket.PageMediaType, "printTicket.PageMediaType")
            Loop

    質問1
    LocalPrinterは、取得できますが、Network上の共有設定したPrinterやNetworkPrinterは、取得できません。
    どうすればできるでしょうか。
    質問2
    そのPrinterの持っている印刷品質と用紙種類の一覧を取得したいのですが、やり方がわかりません。

    よろしくお願い致します。

     

    2014年12月20日 9:20

回答

  • 質問 1 に関してはプリンタドライバなども影響すると思います。
    プリンタメーカーにも確認されてはどうでしょうか?

    質問 2 に関しては PrintCapabilities で取得できると思います。
    Dim printCapabilities As PrintCapabilities = printQueue.GetPrintCapabilities
    ’ 件数を取得
    Debug.WriteLine(printCapabilities.OutputQualityCapability.Count, "printCapabilities.OutputQualityCapability")


    • 回答としてマーク NipponMaru 2014年12月23日 6:55
    • 編集済み こぐま 2014年12月25日 15:00 誤りとの指摘が入ったため
    2014年12月22日 6:00

すべての返信

  • 質問 1 に関してはプリンタドライバなども影響すると思います。
    プリンタメーカーにも確認されてはどうでしょうか?

    質問 2 に関しては PrintCapabilities で取得できると思います。
    Dim printCapabilities As PrintCapabilities = printQueue.GetPrintCapabilities
    ’ 件数を取得
    Debug.WriteLine(printCapabilities.OutputQualityCapability.Count, "printCapabilities.OutputQualityCapability")


    • 回答としてマーク NipponMaru 2014年12月23日 6:55
    • 編集済み こぐま 2014年12月25日 15:00 誤りとの指摘が入ったため
    2014年12月22日 6:00
  • >>プリンタメーカーにも確認されてはどうでしょうか?<<
    確認してみます。

    >>PrintCapabilities で取得できると思います。<<
    ありがとうございます。

     

    2014年12月23日 6:55
  • LocalPrintServer クラスの親である PrintServer クラスも確認した上での質問なのでしょうか?

    Jitta@わんくま同盟

    2014年12月24日 4:11
  • // C# でごめん
    void EnumCapabilities(string サーバ名)
    {
        PrintServer server = new PrintServer(サーバ名);
        foearch (PrintQueue queue in server.GetPrintQueues())
        {
            // サーバに定義されているすべてのプリンタで実行
            Debug.WriteLine("プリンタ:{0}", queue.FullName);
            PrintCapabilities cap = queue.GetPrintCapabilities();
            Debug.Write("  解像度:");
            forearch (PageResolution reso in cap.PageResolutionCapabilities())
            {
                Debug.Write("({0}, {1}) ", reso.X, reso.Y);
            }
    
            Debug.WriteLine("");
            Debug.Write("  使用可能用紙:");
            forearch (PageMediaSize size in cap.PageMediaSizeCapabilities())
            {
                // サイズは単位に要注意
                DebugWrite("{0}({1}, {2}) ", size.PageMediaSizeName, size.Width, size.Height);
            }
    
            Debug.WriteLine("");
        }
    }
    

     手元の環境で、「サーバ名」に自ホスト名「\\myhost」を指定すると、期待通りの動作をしました。
    リモートサーバを IP アドレスで指定「\\192.168.1.2」すると、Win32 エラー「プリンタ名が無効です。」が発生しました。
    このサーバをホスト名で指定「\\remoteHost」すると、Win32 エラー「アクセスが拒否されました。」が発生しました。

     最初の投稿からは、「PrintServer クラスも試した」のか、試したところ私がやったようなエラーが発生したのか、「PrintServer クラスのインスタンスは生成されたが、PrintQueue から GetPrintCapabilities が実行できなかった」のか、わかりません。「取得できません」とは、どのような状況でしょうか。

     一応、プリンタ ドライバの保守をしています。ローカルで取れるなら(接続できた)リモートでも取れます。上記のエラーはサーバとの接続が失敗しており、ドライバが要因ではありません(ので、そんな問合せされると困る)。


    Jitta@わんくま同盟

    2014年12月25日 13:42
  • Jitta さん、ご指摘ありがとうございます。

    質問1については回答を取り下げさせてもらいました。
    自分の回答の意図としては、プリンタによって取得できないプロパティがあるとの意図での回答のつもりでしたが、回答として不適切だったと思います。

    ありがとうございます。

    2014年12月25日 15:14
  • Jittaさん、割り込んですみません。

    具体的なプリンタが分かりませんが、

    > ローカルで取れるなら(接続できた)リモートでも取れます。

    過去のプリンタには一部、例外もあります。ご注意を。
    # 昔、悩まされました。 理由は単純なのですが、、、。
    もっともここで期待されている内容なら、問題なさそうでもあります。

    また、いくつかのメーカーは、開発者登録を行うと、一部情報を開示してくれるところもあります、、、ありました。

    最新の情報でなく、申し訳ありませんが、参考までに。

    2014年12月25日 15:50
  • > ローカルで取れるなら(接続できた)リモートでも取れます。

    ---------------------------------------------
    Introduction to Print Providers
    http://msdn.microsoft.com/en-us/library/windows/hardware/ff551775(v=vs.85).aspx
    ---------------------------------------------

    上記サイトを見ればわかることですが、リモート プリンタに対する出力パスは複数存在ます。
    リモート プリンタへの出力パスがローカル プリント プロバイダ経由の場合は、「ローカルで取れるなら(接続できた)リモートでも取れる」と思いますが(この場合は通常ローカル プリンタと同じ扱いになるので。)、ネットワーク プリント プロバイダ / 3rd ベンダ製 プリント プロバイダ経由の場合、必ずしも「ローカルで取れるなら(接続できた)リモートでも取れる」とは言い切れないはずです。
    プリンタ デバイスへの出力経路をどのように構成したのか(どのようなプリント スプーラ 構成になっているのか)に依存して、プリンタ情報の取得方法も変更しなければならない可能性があることを考慮する必要があります。
    特に 3rd ベンダ製 プリント プロバイダが組み込まれている場合、そのベンダ独自の機能が提供されているはずなので、プリンタ メーカへの問い合わせが必要になるケースも考えられます。
    従って、こぐまさんが提案された「プリンタ メーカへの問い合わせ」は、否定すべき内容ではなく、むしろ推奨すべき内容だと思います。

    2014年12月26日 2:38
  •  指摘とかのつもりではありません。
    「最初の投稿からは、「PrintServer クラスも試した」のか、試したところ私がやったようなエラーが発生したのか、「PrintServer クラスのインスタンスは生成されたが、PrintQueue から GetPrintCapabilities が実行できなかった」のか、わかりません。「取得できません」とは、どのような状況でしょうか。」
    という事なんです。
     いや、実際、困っていることだけ伝えられて困っているんです。目的だとか、環境だとか、操作したことだとか、「困っている」という状態を取り巻くいろいろな情報から、解決のための道を見つけるんじゃないですか?ここ、フォーラムでも、「情報が足りません」という返答は多いですよね。この質問も、情報が足りないと、私は判断しています。


    Jitta@わんくま同盟

    2014年12月28日 6:20