#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. Примечание: ссылка не работает, но вы все равно можете видеть ее на аппарате обратной передачи