Reputation: 19180
Is there a way to find all print trays on a printer and get their paper sizes e.g.
Tray1 = A4
Tray2 = A3
Tray3 = Letter
I can see a way to get the Trays using something like this but it doesn't seem to have the paper size information.
using (System.Drawing.Printing.PrintDocument doc = new PrintDocument())
{
foreach (System.Drawing.Printing.PaperSource paperSource in doc.PrinterSettings.PaperSources)
{
string trayName = paperSource.SourceName;
}
}
What I am wanting to do is select the best Tray for the print job by default.
Upvotes: 5
Views: 7328
Reputation: 31
I think an easier way in C# is to query the PrintDocument Printer Settings.
PrintDocument printDoc = new PrintDocument();
PrinterSettings printSettings = printDoc.PrinterSettings;
for (int i=0; i < printSettings.PaperSources.Count; i++)
{
sTmp += printSettings.PaperSources[i].SourceName;
sTmp += " : ";
sTmp += printSettings.PaperSources[i].Kind.ToString();
sTmp += " : ";
sTmp += printSettings.PaperSources[i].RawKind.ToString();
sTmp += "\n";
}
MessageBox.Show(sTmp, "Paper Sources for " + printSettings.PrinterName+ " : " +
printSettings.IsDefaultPrinter.ToString());
If I look for "Tray 2" in SourceName and use RawKind, I get the same answer as GetBinNumber above with having to import winspool.drv.
Am I missing something?
Upvotes: 2
Reputation: 10054
You can get the printer properties which includes the paper bins (trays) for the printer using windows api: http://msdn.microsoft.com/en-us/library/bb258176(v=office.12).aspx http://www.thedbcommunity.com/index.php?option=com_content&task=view&id=218&Itemid=56
You could use the IPaper class in ArcObjects SDK 10 Microsoft.NET Framework (I am not quite sure about how this works) http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//0001000002wn000000
Edit: Just took an in depth look on one of the links I gave you, this should be the answer you're looking for:
// Get Printer Tray Codes for Word Printing using DeviceCapabilities
// By: BB
//
// Inputs:1)strTrayName - Name of the tray to search for, ie "Tray 1", "Tray 2", "Manual"
/// <summary>
/// Gets the printer code for the specified tray, based on the current printer for the Word Document
/// Printer trays on various HP printers change between models and Word documents
/// will not act the same when printed on different printers. This allows us
/// to get the right code for the tray we want to print to.
/// </summary>
/// <param name="strTrayName">Name of the tray to search for, ie "Tray 1", "Tray 2", "Manual"</param>
/// <param name="iDefaultBin">A default bin to return if not found ie. (int)WdPaperTray.wdPrinterUpperBin</param>
/// <param name="wordDoc">A word document object that we want to check the printer for</param>
/// <returns></returns>
public int GetBinNumber(string strTrayName, int iDefaultBin, Word.Document wordDoc)
{
//Code adapted from Microsoft KB article Q194789
//HOWTO: Determine Available PaperBins with DeviceCapabilities API
//Get the printer & port names and numbers of the current printer
//
// Once we have the printer bin we can then use
// InvokeMember on the wordDoc.PageSetup object to set the bin.
//
// Example call to this method is
// int Tray1Code = GetBinNumber("Tray 1",(int)WdPaperTray.wdPrinterUpperBin);
int BinRes;
BinRes = iDefaultBin; //set up a default bin as the lower
try
{
string sPort = wordDoc.Application.ActivePrinter.Substring(wordDoc.Application.ActivePrinter.IndexOf(" on ") + 3).Trim();
string sCurrentPrinter = wordDoc.Application.ActivePrinter.Substring(0, wordDoc.Application.ActivePrinter.IndexOf(" on ")).Trim();
//'Find out how many printer bins there are
Int32 iBinCnt = DeviceCapabilities(sCurrentPrinter, sPort, DC_BINS, null, IntPtr.Zero);
if (iBinCnt > -1)
{
//'Set the array of bin numbers to the right size
UInt16[] iBinArray = new UInt16[iBinCnt];
//set up a buffer to receive the bin names - each name is up to 24 chars, null terminated
byte[] buffer = new byte[iBinCnt * 24];
// Load the array with the bin numbers
iBinCnt = DeviceCapabilitiesA(sCurrentPrinter, sPort, DC_BINS, iBinArray, IntPtr.Zero);
if (iBinCnt > -1)
{
// Load the array of bin names
iBinCnt = DeviceCapabilitiesA(sCurrentPrinter, sPort, DC_BINNAMES, buffer, IntPtr.Zero);
if (iBinCnt > -1)
{
string sBinNames = Encoding.ASCII.GetString(buffer, 0, buffer.Length);
//split the null terminated strings into a string array for searching
while (sBinNames.IndexOf("\0\0") > -1)
{
sBinNames = sBinNames.Replace("\0\0", "\0");
}
string[] arrBinNames = sBinNames.Split('\0');
//System.Diagnostics.Debug.WriteLine("prn nams = " + res );
int idx = 0;
foreach (string BinNam in arrBinNames)
{
if( BinNam.Trim().StartsWith(strTrayName))
{
BinRes = iBinArray[idx];
break;
}
idx++;
}
}
}
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("Error - " + ex.Message );
}
return BinRes;
}
Copied partly from the website due to restrictions, you can view the full code here:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=3687&lngWId=10
Upvotes: 3
Reputation: 877
Check this code from MSDN. Have you tried it? May be you can match the PaperSize name with the tray name.
// Add list of supported paper sizes found on the printer.
// The DisplayMember property is used to identify the property that will provide the display string.
comboPaperSize.DisplayMember = "PaperName";
PaperSize pkSize;
for (int i = 0; i < printDoc.PrinterSettings.PaperSizes.Count; i++){
pkSize = printDoc.PrinterSettings.PaperSizes[i];
comboPaperSize.Items.Add(pkSize);
}
// Create a PaperSize and specify the custom paper size through the constructor and add to combobox.
PaperSize pkCustomSize1 = new PaperSize("First custom size", 100, 200);
comboPaperSize.Items.Add(pkCustomSize1);
Upvotes: 2