.net - net - printer c#
.NET encuentra el tamaƱo de la bandeja de papel (3)
¿Hay alguna manera de encontrar todas las bandejas de impresión en una impresora y obtener sus tamaños de papel, por ejemplo,
Tray1 = A4
Tray2 = A3
Tray3 = Letter
Puedo ver una forma de obtener las bandejas usando algo como esto, pero no parece tener la información del tamaño del papel.
using (System.Drawing.Printing.PrintDocument doc = new PrintDocument())
{
foreach (System.Drawing.Printing.PaperSource paperSource in doc.PrinterSettings.PaperSources)
{
string trayName = paperSource.SourceName;
}
}
Lo que quiero hacer es seleccionar la mejor bandeja para el trabajo de impresión de forma predeterminada.
Puede obtener las propiedades de la impresora que incluye las bandejas de papel (bandejas) para la impresora con la API de Windows: 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
Puede usar la clase IPaper en ArcObjects SDK 10 Microsoft.NET Framework (no estoy seguro de cómo funciona esto) http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/ / 0001000002wn000000
Editar: Solo eché un vistazo en profundidad a uno de los enlaces que te di, esta debería ser la respuesta que estás buscando:
// 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;
}
Copiado en parte del sitio web debido a restricciones, puede ver el código completo aquí:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=3687&lngWId=10
Creo que una manera más fácil en C # es consultar la configuración de la impresora PrintDocument.
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());
Si busco "Bandeja 2" en SourceName y uso RawKind, obtengo la misma respuesta que GetBinNumber anterior al tener que importar winspool.drv.
¿Me estoy perdiendo de algo?
Verifique este código de MSDN. ¿Lo has probado? Puede ser que coincida con el nombre de PaperSize con el nombre de la bandeja.
// 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);