2011-07-15 98 views
5

有没有办法在打印机上查找所有的打印纸​​盒并获取纸张尺寸.NET查找纸盒尺寸

Tray1 = A4 
Tray2 = A3 
Tray3 = Letter 

我可以看到一种方式来使用类似这样的东西,但它似乎没有纸张尺寸信息。

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

我想要做的是默认选择打印作业的最佳托盘。

+0

它是Web应用程序还是WPF? – Ankit

+0

它是一个Winforms项目 – PeteT

+0

想想..如果您只是在寻找最适合打印作业的托盘,为什么不使用最大的托盘并指定纸张尺寸? –

回答

3
  1. 你可以得到打印机属性,其中包括使用Windows API的打印机的纸张箱(盘): http://msdn.microsoft.com/en-us/library/bb258176(v=office.12).aspx http://www.thedbcommunity.com/index.php?option=com_content &任务=视图& ID = 218 &的itemid = 56

  2. 你可以使用的ArcObjects SDK 10 Microsoft.NET Framework中的IPaper类(我不太肯定这是如何工作) http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//0001000002wn000000

编辑:只是采取了一个深入了解对我给你的链接之一,这应该是你正在寻找的答案:由于限制,可以

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

从网站复制部分查看完整的代码在这里:

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

2

检查从MSDN此代码。你试过了吗?可能是您可以将PaperSize名称与纸盒名称进行匹配。

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

你知道什么comboPaperSize实际上是什么? – David

2

我想在C#一个简单的方法是查询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()); 

如果我期待在SOURCENAME“盘2”,并使用RawKind,我得到上面有进口WINSPOOL.DRV相同的答案GetBinNumber。

我错过了什么吗?