更改打印机默认纸张大小

7
我有几个自定义纸张尺寸已经在打印机上定义好了(打印机设置为默认)。我需要能够选择其中一个格式作为默认格式。
最理想的方式是编程(C#)实现,但命令行也可以接受。
目前,我可以获取打印机上定义的纸张尺寸列表(名称/尺寸),并且我可以找到哪一个是默认值。
要选择其他格式作为默认格式,我目前唯一的解决方案是通过更改devMode结构上的dmPaperSize字段;但是我无法找到与所需纸张格式相对应的正确值。因此,我将dmPaperSize设置为0,并逐渐增加它,直到正确的格式出现在打印机上。在某些打印机上,这需要很长时间。
是否有其他方法可以按名称选择默认打印机上的纸张格式?

你试过我建议的解决方案了吗? - Shashank Chaturvedi
3个回答

9
你正在朝着更改默认打印机设置的正确方向前进。.NET不直接支持更改打印机的默认设置。
我使用了this codeproject文章中的PrinterSettings类来更改打印机设置。
可以使用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);
        }            
    }
}

PaperSize.RawKind 正是我一直在寻找的,谢谢! - Andy
@Andy - 很高兴能帮忙 :) - Junaith
不确定您从哪里找到了PrinterSettings.ChangePrinterSetting()或者PrinterSettings.GetPrinterSettings()方法,但它们并没有出现在MSDN https://msdn.microsoft.com/en-us/library/system.drawing.printing.printersettings_properties(v=vs.110).aspx 上。这是某种特殊的对象/自定义类吗? - Kraang Prime
@SanuelJackson PrinterSettingsзұ»жқҘиҮӘCodeProjectж–Үз« пјҲй“ҫжҺҘеңЁзӯ”жЎҲдёӯпјүпјҢиҖҢдёҚжҳҜ.NETжЎҶжһ¶гҖӮ - Junaith
2
我同意,PrinterData未定义。它也不在codeproject类中。但是进入讨论部分并查看此帖子以了解如何创建缺失的类:https://www.codeproject.com/Articles/6899/Changing-printer-settings-using-C?msg=5142354#xx5142354xx - André Gollubits
显示剩余5条评论

6
以下代码将设置默认打印机纸张大小:
PrintDocument pd = new PrintDocument();
pd.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("PaperA4", 840, 1180);
pd.Print();

如果您想使用PrintDocument打印,请参考此链接

希望这能帮到您。


1
虽然问题是关于将现有格式选择为默认值(而不是打印),但此代码仅适用于某些打印机。但我并不想打印,我想更改打印机上的默认设置,以便在发送文档时(由任何其他程序发送),将使用新格式。 - Andy

0

对我来说,这行代码在从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);
    }
}

这段代码在按钮点击事件中被调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接