Как установить тип бумаги при использовании PrinterDialog? - PullRequest
2 голосов
/ 06 октября 2011

Я пытаюсь напечатать файл изображения без вывода сообщений, и мне нужно напечатать его на бумаге специального типа («Глянцевая фотобумага») и на определенном размере (10 см на 15 см).

На обычных окнах7 диалогов печати, которые я могу выбрать:

Бумага Размер ,

Бумага Качество (например - «Авто», «Высокий», «Стандартный»"," Custom ")

Бумага Тип (" Обычная бумага "," Глянцевая фотобумага "," Фотобумага Plus Glossy "," Фотобумага Pro Platinum "," Hagaki ",и т.д. ...)

Но с помощью кода на C # мне удалось установить только PaperSize (что равно 4 "на 6" == 10 см на 15 см).

Моя проблема в том, как мне получить возможность установить Paper Type , а not PaperSource («Tray 1», «Tray»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();

спасибовсе заранее.

Ответы [ 2 ]

3 голосов
/ 01 октября 2013

На самом деле это можно сделать без DEVMODE.Установите тип бумаги с помощью свойства PrintTicket.PageMediaType .Для пример :

    // ---------------------- 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;
    }
2 голосов
/ 07 ноября 2011

Я не говорю, что это невозможно, но это не будет красиво.Теоретически вы можете получить структуру DEVMODE устройства (эта структура будет иметь расширения, специфичные для драйвера принтера), установить правильные значения и затем записать его обратно.Для этого есть несколько вспомогательных функций объекта PrinterSettings.Вот пример того, как это сделать здесь

...