프로그래밍_Programing/C#

프린터 용지함 설정하기

NineTIN 2017. 2. 15. 17:08

XPS도큐먼트 파일 인쇄 기준으로 해당 프린터기의 인쇄함을 지정 하는 방법이 있다.

PrintQueue에서 PrintCapabilities를 가져오고 거기에서 InputBinCapability를 확인하면 무엇을 지정할 수 있는지 알 수 있다.

그것을 PrintTicket에 설정만 하면 되는데....골 때리게도 파라메터는


0. AutoSelect

1. Manual


두개 인 경우가 대부분(...)

그렇다면 방법이 없는가?

그 방법은 이러하다


먼저 해당 프린터 드라이버 스키마에서 정보를 읽어오자


public List GetInputBinName(PrintQueue printerQueu, out string nameSpaceURI)
        {
            List binName = new List();
            PrintQueue printQueue = printerQueu;
            //프린터의 PrintCapabilities를 XML로 취득
            MemoryStream printerCapXmlStream = printQueue.GetPrintCapabilitiesAsXml();
            //취득한 정보를 XML도큐먼트로 로드
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(printerCapXmlStream);
            // NamespaceManager를 생성한 후에 프린터의 스키마를 추가
            XmlNamespaceManager manager = new XmlNamespaceManager(xmlDoc.NameTable);
            manager.AddNamespace(xmlDoc.DocumentElement.Prefix, xmlDoc.DocumentElement.NamespaceURI);
            nameSpaceURI = xmlDoc.ChildNodes[1].GetNamespaceOfPrefix("ns0000");
            //프린터의 용지함 정보만 노드에서 뽑아낸다.
            XmlNodeList nodeList = xmlDoc.SelectNodes("//psf:Feature[@name='psk:JobInputBin']/psf:Option", manager);

            for (int i = 0; i < nodeList.Count; i++)
            {
                binName.Add(nodeList[i].Attributes["name"].Value);
            }

            return binName;
        }


그런 다음

기존의 PrintTicket을 수정 시켜주면 되는데

디버그 모드에서 XML Doc의 내용을 보면서 원하는 부분을 수정 할 수 있다.

용지함의 경우에는 psk:JobInputBin을featureName 으로 주고 아까 취득한 노드값을 newValue에 주면된다. 


        public PrintTicket ModifyPrintTicket(PrintTicket ticket, string featureName, string newValue, string nameSpaceURI)
        {
            if (ticket == null)
            {
                throw new ArgumentNullException("ticket");
            }
            
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(ticket.GetXmlStream());

            XmlNamespaceManager manager = new XmlNamespaceManager(xmlDoc.NameTable);
            manager.AddNamespace(xmlDoc.DocumentElement.Prefix, xmlDoc.DocumentElement.NamespaceURI);
            
            string xpath = string.Format("//psf:Feature[@name='{0}']/psf:Option", featureName);
            XmlNode node = xmlDoc.SelectSingleNode(xpath, manager);
            if (node != null)
            {
                if (newValue.StartsWith("ns0000"))
                {
                    XmlAttribute namespaceAttribute = xmlDoc.CreateAttribute("xmlns:ns0000");
                    namespaceAttribute.Value = nameSpaceURI;
                    xmlDoc.DocumentElement.Attributes.Append(namespaceAttribute);
                }
                node.Attributes["name"].Value = newValue;
            }
            
            MemoryStream printTicketStream = new MemoryStream();
            xmlDoc.Save(printTicketStream);
            printTicketStream.Position = 0;
            PrintTicket modifiedPrintTicket = new PrintTicket(printTicketStream);
            
            return modifiedPrintTicket;
        }

수정이 다 되었다면

PrintQueue를 Commit 해주면 적용이 완료된다.