如何在使用PrinterDialog时设置纸张类型?

我正在尝试静默打印图片文件,我需要在特殊纸张类型(“光面相纸”)上打印,并在一定尺寸(10厘米,15厘米)上打印。

在普通的Windows 7打印对话框中,我可以选择:

纸张尺寸

纸张质量 (例如 – “自动”,“高”,“标准”,“自定义”)

纸张类型 (“普通纸”,“光面照片纸”,“高级光面照片纸”,“白金相纸”,“Hagaki”等…)

但是,通过c#代码,我设法只设置PaperSize (在6英尺上是4英尺= 15厘米上的10厘米)。

我的问题是如何获得设置纸张类型的选项,而不是 PaperSource (“纸盘1”,“纸盘2”等)….

我知道每台打印机都有自己支持的纸张类型,所以我可能需要遍历所有,但我无法弄清楚如何。

这是我目前的代码:

string strPrinterName = "Canon iP4850"; PrintDocument printDoc = new PrintDocument(); // We set the paper size printDoc.DefaultPageSettings.PaperSize = new PaperSize("PhotoPaper", 400, 600); // Inside the event i actually draw the image all over the paper by using e.Graphics.DrawImage(...) printDoc.PrintPage += PrintDocPrintPage; // Creating the print dialog PrintDialog dlgPrint = new PrintDialog { Document = printDoc }; // We choose the printer dlgPrint.PrinterSettings.PrinterName = strPrinterName; // just to be sure - give the new size of our paper dlgPrint.PrinterSettings.DefaultPageSettings.PaperSize = new PaperSize("PhotoPaper", 400, 600); // If the printer is invalid if (!dlgPrint.PrinterSettings.IsValid) { throw new Exception(@"Printer is invalid" + Environment.NewLine + strPrinterName); } // Print without showing the dialog printDoc.Print(); 

谢谢大家。

我不是说这是不可能的,但它不会很漂亮。 从理论上讲,您可以获得设备的DEVMODE结构(该结构将具有特定于打印机驱动程序的扩展)设置正确的值,然后将其写回。 PrinterSettings对象有一些辅助函数来执行此操作。 这里有一个例子

这实际上可以在没有DEVMODE的情况下完成。 通过PrintTicket.PageMediaType属性设置纸张类型。 例如 :

  // ---------------------- GetPrintTicketFromPrinter ----------------------- ///  /// Returns a PrintTicket based on the current default printer. ///  /// A PrintTicket for the current local default printer. public PrintTicket GetPrintTicketFromPrinter() { PrintQueue printQueue = null; var localPrintServer = new LocalPrintServer(); // Retrieving collection of local printer on user machine PrintQueueCollection localPrinterCollection = localPrintServer.GetPrintQueues(); System.Collections.IEnumerator localPrinterEnumerator = localPrinterCollection.GetEnumerator(); if (localPrinterEnumerator.MoveNext()) { // Get PrintQueue from first available printer printQueue = (PrintQueue)localPrinterEnumerator.Current; } else { // No printer exist, return null PrintTicket return null; } // Get default PrintTicket from printer PrintTicket printTicket = printQueue.DefaultPrintTicket; PrintCapabilities printCapabilites = printQueue.GetPrintCapabilities(); // Modify PrintTicket if (printCapabilites.PageMediaTypeCapability.Contains(PageMediaType.CardStock)) { printTicket.PageMediaType = PageMediaType.CardStock; } return printTicket; }