2011-10-05 65 views
2

我試圖無聲打印圖片文件,我需要在特殊紙張類型(「光面照片紙」)上打印,並在特定尺寸(15釐米10釐米)上打印。如何在使用PrinterDialog時設置紙張類型?

在正常的Windows 7打印對話框我可以選擇:

紙張尺寸

質量(例如 - 「自動」, 「高」, 「標準」, 「自定義」 )

紙張類型( 「普通紙」, 「光澤照片紙」, 「高級光面照片紙」, 「專業照片紙鉑金」, 「明信片」,等...)

但是,通過c#代碼,我設法只設置了紙張尺寸(它在15釐米的6英尺== 10釐米上是4英寸)。

我的問題是我如何去設置紙張類型選項,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(); 

謝謝大家提前。

+1

我不是說這是不可能的,但它不會很漂亮。從理論上講,您可以獲得設備的DEVMODE結構(該結構將具有特定於打印機驅動程序的擴展)設置正確的值,然後將其寫回。 PrinterSettings對象有一些幫助功能可以執行此操作。 – user957902

+0

像這樣[link](http://nicholas.piasecki.name/blog/2008/11/programmatically-selecting-complex-printer-options-in-c-shar/)?我會嘗試... – itsho

+0

是的,這正是你需要做的。 – user957902

回答

2

我並不是說這是不可能的,但它不會很漂亮。理論上,您可以獲得設備的DEVMODE結構(該結構將具有特定於打印機驅動程序的擴展名)設置正確的值,然後將其寫回。 PrinterSettings對象有一些輔助函數用於執行此操作。有一個這樣做的例子:here

+0

注意:鏈接已損壞,但您仍然可以看到它[wayback machine](http://web.archive.org/web/20130826203749/http://nicholas.piasecki.name/blog/2008/11/programmatically -selecting-complex-printer-options -in -c-shar /) – itsho

2

這實際上可以在沒有DEVMODE的情況下完成。通過PrintTicket.PageMediaType屬性設置紙張類型。對於example

// ---------------------- GetPrintTicketFromPrinter ----------------------- 
    /// <summary> 
    /// Returns a PrintTicket based on the current default printer.</summary> 
    /// <returns> 
    /// A PrintTicket for the current local default printer.</returns> 
    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; 
    } 
+0

謝謝!我希望我知道回來比:-)。值得一提的是它與.Net 3.0相關。 – itsho

相關問題