c# - 使用 PrinterDialog 时如何设置纸张类型?

标签 c# printing customization

我正在尝试以静默方式打印图片文件,并且需要在特殊纸张类型(“光面照片纸”)和特定尺寸(10 厘米乘 15 厘米)上打印它。

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

纸张尺寸

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

纸张类型(“普通纸”、“光面照片纸”、“高级光面照片纸”、“专业白金照片纸”、“Hagaki”等...)

但是,通过 C# 代码,我成功地仅设置了 PaperSize(即 4'' on 6'' == 10cm on 15cm)。

我的问题是如何获得设置纸张类型的选项,以及纸张来源(“纸盘 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 的情况下完成。通过 PrintTicket.PageMediaType 设置纸张类型属性(property)。对于 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;
    }

关于c# - 使用 PrinterDialog 时如何设置纸张类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7668873/

相关文章:

windows - 在 Windows 上打印源代码

c++ - 如何报告自定义 istream 失败

iOS - 可以包含其他 View 的自定义 View

c# - 将 Unityscript 转换为 C# : what does something like if(format & 2) mean?

c# - 在 Windows 上将数据插入文件

c# - ASP.NET C# 线程中止异常?

c# - 代码生成器或 T4 模板,它们真的是邪恶的吗?

带有过多细节的 JavaScript window.print() 函数

css - 什么是最有用的媒体 ="print"特定的、跨浏览器兼容的 css 属性?

android - 如何在 MapView 上附加自定义 map ? [安卓]