Het printen vanuit C# .NET WPF voorziet in veel flexibiliteit. Echter het aansturen van een specifieke printerlade (bin of tray genoemd) is niet heel eenvoudig. Hiervoor moet gebruikt worden van printQueue.GetPrintCapabilitiesAsXml() methode. Uit de xml is af te leiden welke bins aanwezig zijn.
Hieronder C# code om op te vragen welke printerlades voor een specifieke printer beschikbaar zijn.
public static List<PrinterBinModel> GetInputBins(PrintQueue printQueue)
{
var result = new List<PrinterBinModel>();
XmlDocument xmlDoc = null;
using (var stream = printQueue.GetPrintCapabilitiesAsXml())
{
xmlDoc = new XmlDocument();
xmlDoc.Load(stream);
}
var manager = new XmlNamespaceManager(xmlDoc.NameTable);
manager.AddNamespace(xmlDoc.DocumentElement.Prefix, xmlDoc.DocumentElement.NamespaceURI);
// Select all job input bins.
var nodeList = xmlDoc.
SelectNodes("//psf:Feature[@name='psk:JobInputBin']/psf:Option/psf:Property",manager);
if (nodeList != null)
{
foreach (XmlNode node in nodeList)
{
result.Add(new PrinterBinModel
{
Name = node.LastChild.InnerText,
SystemName = node.ParentNode.Attributes[0].Value
});
}
}
return result;
}
Om een specifieke printerlade aan te sturen worden eerst alle bins opgevraagd. Van de bin in de lijst die we zoeken komen we dan dan de systeem xml naam te weten. Die wordt gebruikt om nieuw PrintTicket te maken met de aangepaste bin.
private static PrintTicket ModifyPrintTicketBin(PrintQueue printQueue, PrintTicket ticket
, string binName)
{
var bins = GetInputBins(printQueue);
var binItem = bins.
FirstOrDefault(n => string.Compare(n.Name, binName, StringComparison.InvariantCultureIgnoreCase) == 0);
if (binItem == null || string.IsNullOrEmpty(binItem.SystemName))
return ticket;
var newValue = binItem.SystemName;
const string featureName = "psk:JobInputBin";
var xmlDoc = new XmlDocument();
xmlDoc.Load(ticket.GetXmlStream());
var 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);
var found = false;
if (node != null)
{
if (node.Attributes["name"].Value != newValue)
{
node.Attributes["name"].Value = newValue;
found = true;
}
}
if (!found)
return ticket;
PrintTicket modifiedPrintTicket = null;
using (var stream = new MemoryStream())
{
xmlDoc.Save(stream);
stream.Position = 0;
modifiedPrintTicket = new PrintTicket(stream);
}
return modifiedPrintTicket;
}