2011-07-15 25 views
5

Yazıcının tüm yazdırma tepsilerini bulmanın ve kağıt boyutlarını almanın bir yolu var mı?.NET kağıt kaseti boyutunu bul

Tray1 = A4 
Tray2 = A3 
Tray3 = Letter 

Tepsileri böyle bir şey kullanarak elde etmenin bir yolunu görebiliyorum, ancak kağıt boyutu bilgilerinin olmadığı anlaşılıyor.

using (System.Drawing.Printing.PrintDocument doc = new PrintDocument()) 
{ 
    foreach (System.Drawing.Printing.PaperSource paperSource in doc.PrinterSettings.PaperSources) 
    { 
     string trayName = paperSource.SourceName; 
    } 
} 

Yapmak istediğim, varsayılan olarak yazdırma işi için en uygun Kaseti seçmektir.

+0

Web uygulaması mı yoksa WPF mi? – Ankit

+0

Bir Winforms projesi – PeteT

+0

Sadece düşünüyorum ... sadece yazdırma işi için en iyi tepsiyi arıyorsanız, neden sadece en büyük tepsiyi kullanıp kağıt boyutunu belirtin? –

cevap

3
  1. Sen pencereler API kullanarak yazıcı için kağıt bidonları (tepsiler) içeren yazıcı özelliklerini alabilirsiniz: http://msdn.microsoft.com/en-us/library/bb258176(v=office.12).aspx http://www.thedbcommunity.com/index.php?option=com_content & görev = view & id = 218 & Itemid = 56

  2. Sen ArcObject SDK 10 Microsoft.NET Framework içinde IPaper sınıfını (Bunun nasıl çalıştığını tam olarak emin değilim) http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//0001000002wn000000

  3. kullanabilirsiniz

Düzenleme: nedeniyle yapabilirsiniz kısıtlamalara web sitesinden kısmen Kopyalanan

// 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; 
     } 

: Sadece bu aradığınız cevabı olmalı sana verdiğim bağlantılardan birini derinlik görünüm bir aldı burada tam kodunu görüntülemek:

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

2

Kontrol MSDN'den bu kodu. Bunu denediniz mi? PaperSize adını tepsi adıyla eşleştirebilirsiniz.

// 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

Aslında comboPaperSize ne olduğunu biliyor musunuz? – David

2

C# 'da daha kolay bir yol PrintDocument Yazıcı Ayarlarını sorgulamaktır. Ben sourceName içinde "Kaset 2'ye" ni bulun ve RawKind kullanırsanız

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()); 

, ben Winspool.drv ithal etmek zorunda olan yukarıda GetBinNumber aynı cevabı alır.

Bir şey mi eksik?

İlgili konular