как мне задать тип бумаги при использовании PrinterDialog?

#c# #printing #customization

#c# #печать #настройка

Вопрос:

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

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

Размер бумаги,

Качество бумаги (например, «Автоматическое», «Высокое», «Стандартное», «Пользовательское»)

Тип бумаги («Обычная бумага», «Глянцевая фотобумага», «Фотобумага плюс глянцевая», «Фотобумага Pro Platinum», «Хагаки» и т. Д.)

Но с помощью кода c # мне удалось установить только размер бумаги (который равен 4 «на 6» == 10 см на 15 см).

Моя проблема в том, как мне получить возможность установить тип бумаги, а не источник бумаги («Лоток 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 есть несколько вспомогательных функций.

2. что-то вроде этой ссылки ? я попробую…

3. Да, это именно то, что вам нужно будет сделать.

Ответ №1:

На самом деле это можно сделать без 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;
    }
  

Комментарии:

1. Спасибо!. Хотел бы я знать это раньше, чем :-). возможно, стоит упомянуть, что это относится к .Net 3.0.

Ответ №2:

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

Комментарии:

1. Примечание: ссылка не работает, но вы все равно можете видеть ее на аппарате обратной передачи