XPS도큐먼트 파일 인쇄 기준으로 해당 프린터기의 인쇄함을 지정 하는 방법이 있다.
PrintQueue에서 PrintCapabilities를 가져오고 거기에서 InputBinCapability를 확인하면 무엇을 지정할 수 있는지 알 수 있다.
그것을 PrintTicket에 설정만 하면 되는데....골 때리게도 파라메터는
0. AutoSelect
1. Manual
두개 인 경우가 대부분(...)
그렇다면 방법이 없는가?
그 방법은 이러하다
먼저 해당 프린터 드라이버 스키마에서 정보를 읽어오자
public ListGetInputBinName(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 해주면 적용이 완료된다.
'프로그래밍_Programing > C#' 카테고리의 다른 글
WPF에서 Window 창 위치의 보존&복원을 해보자 (0) | 2017.01.17 |
---|---|
[번외] TortoiseSVN log export 했을 때 문자깨짐 문제 (2) | 2016.12.16 |
무엇이 다른가? WPF, WinRT, UWP(Universal Windows Platform) (1) | 2016.12.16 |