2011-07-15 30 views
5

Có cách nào để tìm tất cả các khay in trên máy in và nhận được kích thước giấy của chúng, ví dụ:.NET tìm kích thước khay giấy

Tray1 = A4 
Tray2 = A3 
Tray3 = Letter 

Tôi có thể thấy cách để đưa Khay bằng cách sử dụng một cái gì đó như thế này nhưng dường như không có thông tin về kích thước giấy.

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

Điều tôi muốn làm là chọn Khay tốt nhất cho lệnh in theo mặc định.

+0

Có ứng dụng web hoặc WPF không? – Ankit

+0

Dự án Winforms của nó – PeteT

+0

Chỉ cần suy nghĩ .. nếu bạn chỉ tìm kiếm khay tốt nhất cho công việc in, tại sao không chỉ sử dụng khay lớn nhất và chỉ định khổ giấy ?? –

Trả lời

3
  1. Bạn có thể nhận được các thuộc tính máy in bao gồm các thùng giấy (khay) cho máy in sử dụng windows api: http://msdn.microsoft.com/en-us/library/bb258176(v=office.12).aspx http://www.thedbcommunity.com/index.php?option=com_content & nhiệm vụ = xem & id = 218 & Itemid = 56

  2. Bạn có thể sử dụng lớp iPaper trong ArcObjects SDK 10 Khung Microsoft.NET (tôi không hoàn toàn chắc chắn về cách làm việc này) http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//0001000002wn000000

Chỉnh sửa: Chỉ cần mất một cái nhìn sâu sắc vào một trong các liên kết Tôi đưa cho bạn, điều này sẽ là câu trả lời bạn đang tìm kiếm:

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

sao chép một phần từ trang web do những hạn chế, bạn có thể xem toàn bộ mã tại đây:

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

2

Kiểm tra mã này từ MSDN. Bạn đã thử chưa? Có thể bạn có thể khớp tên PaperSize với tên khay.

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

Bạn có biết comboPaperSize thực sự là gì không? – David

2

Tôi nghĩ rằng cách dễ dàng hơn trong C# là truy vấn Cài đặt máy in 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()); 

Nếu tôi tìm kiếm "Tray 2" trong SOURCENAME và sử dụng RawKind, tôi nhận được câu trả lời tương tự như GetBinNumber trên với việc phải nhập khẩu winspool.drv.

Tôi có thiếu gì đó không?

Các vấn đề liên quan