Изменить размер бумаги по умолчанию для принтера
У меня есть несколько нестандартных размеров бумаги, определенных на принтере (принтер установлен по умолчанию). Мне нужно иметь возможность выбрать один из этих форматов в качестве формата по умолчанию.
Программное (C#) решение было бы идеальным, но с командной строкой тоже было бы хорошо.
Прямо сейчас я могу получить список размеров бумаги (имя / размеры), определенных на принтере, и я могу узнать, какой из них используется по умолчанию.
Чтобы выбрать другой формат по умолчанию, единственное решение, которое у меня есть, - это изменение поля dmPaperSize в структуре devMode; НО я не могу найти правильное значение, которое соответствует желаемому формату бумаги. Поэтому я устанавливаю dmPaperSize в 0 и увеличиваю его, пока на принтере не появится правильный формат. На некоторых принтерах это занимает очень много времени.
Есть ли другой способ выбрать (по имени) формат бумаги по умолчанию на принтере по умолчанию?
3 ответа
Вы находитесь в правильном направлении при изменении настроек принтера по умолчанию. .NET не предоставляет прямой поддержки для изменения настроек принтера по умолчанию.
Я использовал PrinterSettings
класс из этой статьи codeproject, чтобы изменить настройки принтера.
Доступные размеры бумаги из принтера можно получить с помощью PrintDocument.PrinterSettings
, См. Пример кода ниже для получения доступных размеров бумаги из принтера и использования PaperSize.RawKind
для изменения размера бумаги принтера.
public class PrinterSettingsDlg : Form
{
PrinterSettings ps = new PrinterSettings();
Button button1 = new Button();
ComboBox combobox1 = new ComboBox();
public PrinterSettingsDlg()
{
this.Load += new EventHandler(PrinterSettingsDlg_Load);
this.Controls.Add(button1);
this.Controls.Add(combobox1);
button1.Dock = DockStyle.Bottom;
button1.Text = "Change Printer Settings";
button1.Click += new EventHandler(button1_Click);
combobox1.Dock = DockStyle.Top;
}
void button1_Click(object sender, EventArgs e)
{
PrinterData pd = ps.GetPrinterSettings(PrinterName);
pd.Size = ((PaperSize)combobox1.SelectedItem).RawKind;
ps.ChangePrinterSetting(PrinterName, pd);
}
void PrinterSettingsDlg_Load(object sender, EventArgs e)
{
PrintDocument pd = new PrintDocument();
pd.PrinterSettings.PrinterName = // printer name
combobox1.DisplayMember = "PaperName";
foreach (PaperSize item in pd.PrinterSettings.PaperSizes)
{
combobox1.Items.Add(item);
}
}
}
Следующий код установит размер бумаги по умолчанию для принтера:
PrintDocument pd = new PrintDocument();
pd.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("PaperA4", 840, 1180);
pd.Print();
О том, как печатать с помощью PrintDocument, вы можете обратиться по этой ссылке.
Надеюсь это поможет.
Для меня эта строка дала ошибку приведения из Devmode в PrinterData.
PrinterData pd = ps.GetPrinterSettings(PrinterName);
Вот что я сделал вместо использования этой функции.
string deviceToUse = "EPSON LQ-590II"; //Printer to look for
string paperToUse = "DOT MATRIX HALF"; //Page size to look for
int paperSizeRawKind = 0; //Variable for paper size
PrintDocument printDocument = new PrintDocument();
PrinterSettings ps = new PrinterSettings();
//Iterate through all printers
foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
{
//Check if printer matches to what I want
if (printer.Contains(deviceToUse))
{
//Iterate through all paper sizes for that printer
for (int i = 0; i < printDocument.PrinterSettings.PaperSizes.Count; i++)
{
//Check if paper size matches what I want
if (printDocument.PrinterSettings.PaperSizes[i].ToString().Contains(paperToUse))
{
//Set Paper Size RawKind here
paperSizeRawKind = printDocument.PrinterSettings.PaperSizes[i].RawKind;
}
}
printDocument.PrinterSettings.PrinterName = printer;
PrinterData printData = new PrinterData();
printData.Size = paperSizeRawKind;
ps.ChangePrinterSetting(printer, printData);
}
}
Этот код вызывается в событии нажатия кнопки.