2011-07-15 52 views
5

¿Hay alguna manera de encontrar todas las bandejas de impresión en una impresora y obtener sus tamaños de papel, p..NET buscar bandeja de papel tamaño

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 estoy queriendo hacer es seleccionar la mejor bandeja para el trabajo de impresión por defecto.

+0

¿Es una aplicación web o WPF? – Ankit

+0

Es un proyecto de Winforms – PeteT

+0

Solo pensando ... si solo está buscando la mejor bandeja para el trabajo de impresión, ¿por qué no simplemente usar la bandeja más grande y especificar el tamaño del papel? –

Respuesta

3
  1. Puede obtener las propiedades de la impresora, que incluye las bandejas de papel (bandejas) de la impresora utilizando 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 & tarea = vista & id = 218 & Itemid = 56

  2. Se puede utilizar la clase iPaper en ArcObjects SDK 10 Microsoft.NET Framework (no estoy muy seguro de cómo funciona esto) http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//0001000002wn000000

Editar: Sólo tomó una mirada en profundidad sobre uno de los enlaces que te di, esto debería ser la respuesta que está 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 de la página web debido a las restricciones, puede ver el código completo aquí:

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=3687&lngWId=10

2

Comprobar el 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); 
+0

¿Sabe realmente qué es comboPaperSize? – David

2

creo 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, me da la misma respuesta que GetBinNumber encima de tener que importar winspool.drv.

¿Echo de menos algo?

Cuestiones relacionadas