用C#编写代码以获取已安装或选定打印机的最大dpi

3
我希望能够获取已安装或所选打印机的最大Dpi。我已经尝试过:
PrinterSettings ps = new PrinterSettings();
        MessageBox.Show(ps.PrinterResolutions.ToString());

我得到的输出是:System.Drawing.Printing.PrinterSettings+PreinterResolutionCollection(期望的输出是600x600)。
4个回答

4

使用LINQ:

PrinterSettings ps = new PrinterSettings();
var maxResolution = ps.PrinterResolutions.OfType<PrinterResolution>()
                                         .OrderByDescending(r => r.X)
                                         .ThenByDescending(r => r.Y)
                                         .First();
MessageBox.Show(String.Format("{0}x{1}", maxResolution.X, maxResolution.Y));

显示错误:错误 4 'System.Drawing.Printing.PrinterSettings.PrinterResolutionCollection' 不包含定义为 'OrderByDescending' 的成员,也没有找到接受类型为 'System.Drawing.Printing.PrinterSettings.PrinterResolutionCollection' 的第一个参数的扩展方法 'OrderByDescending'(是否缺少 using 指令或程序集引用?)。 - user1533870
@Dhaval 请确保你拥有指令 using System.Linq; - tukaef
@Dhaval 我也编辑了我的答案,使其可以与 PrinterResolutions 实现的非泛型 IEnumerable 一起使用。 - tukaef

0

打印机分辨率是一个集合,您需要通过迭代来读取所有可用的分辨率,类似于:

foreach (string installedPrinter in PrinterSettings.InstalledPrinters)
{
    var ps = new PrinterSettings { PrinterName = installedPrinter };
    var maxResolution = ps.PrinterResolutions.Cast<PrinterResolution>().OrderByDescending(pr => pr.X).First();
    Console.WriteLine("{0}: {1}x{2}", installedPrinter, maxResolution.X, maxResolution.Y);
}

或者显示所有打印机及其 PrinterResolutions

foreach (string installedPrinter in PrinterSettings.InstalledPrinters)
{
    var ps = new PrinterSettings { PrinterName = installedPrinter };
    foreach (PrinterResolution printerResolution in ps.PrinterResolutions)
    {
        var tpl = printerResolution.Kind == PrinterResolutionKind.Custom ? "{0}: {1} ({2}x{3})" : "{0}: {1}";
        Console.WriteLine(tpl, installedPrinter, printerResolution.Kind, printerResolution.X, printerResolution.Y);
    }       
}

给Dve:我尝试过那个方法,但它显示的输出是[PrinterResolution High],[PrinterResolution Medium],[PrinterResolution Low],[PrinterResolution Draft]。但我想要的答案是600x600(即我的打印机规格中的最大dpi)。 - user1533870
我得到了三个答案。第三个是佳能iP1300 -1x-1。什么是-1x-1?你能解释一下吗? - user1533870
@Dhaval 只有当 PrinterResolutionKind == custom 时才返回分辨率。请参见此处:http://msdn.microsoft.com/zh-cn/library/system.drawing.printing.printersettings.printerresolutions(v=vs.100).aspx - David

0

这是我使用的 (.NET 2.0,所以没有 Linq)

public static int CompareResolutions(System.Drawing.Printing.PrinterResolution y, System.Drawing.Printing.PrinterResolution x)
{
    if (x.X*x.Y > y.X*y.Y) 
        return 1;
    else if (x.X * x.Y < y.X * y.Y) 
        return -1;

    return 0;
}


public static System.Drawing.Printing.PrinterResolution GetMaxResolution(System.Drawing.Printing.PrintDocument pd)
{
    return GetMaxResolution(pd.PrinterSettings);
}

public static System.Drawing.Printing.PrinterResolution GetMaxResolution(System.Drawing.Printing.PrinterSettings ps)
{
    System.Drawing.Printing.PrinterResolution prMax = null;

    System.Collections.Generic.List<System.Drawing.Printing.PrinterResolution> ls = new System.Collections.Generic.List<System.Drawing.Printing.PrinterResolution>();
    for (int i = 0; i < ps.PrinterResolutions.Count; ++i)
    {
        System.Drawing.Printing.PrinterResolution pres = ps.PrinterResolutions[i];
        ls.Add(pres);
    } // Next i

    ls.Sort(CompareResolutions);

    if (ls.Count > 0)
        prMax = ls[0];

    ls.Clear();
    ls = null;

    return prMax;
}

0

看起来PrinterResolutions是一个集合,你正在尝试将其转换为字符串值。


那么如何获得所需的输出,即600x600(我的打印机规格中的最大dpi)? - user1533870

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