如何通过PaperKind获取预定义的纸张大小

13

我需要通过System.Drawing.Printing.PaperKind获得纸张大小。是否有预定义的值?我不想硬编码或计算纸张大小,我只想通过程序获取它。谢谢。

我需要使用System.Drawing.Printing.PaperKind来获取纸张大小。是否有预定义的值可供选择?我不想硬编码或计算纸张大小,而是希望以编程方式获取它。谢谢。

6个回答

11
通过迭代 PrinterSettings.PaperSizes 集合,可以获取预定义值的子集。
我们的应用程序要求用户选择打印机,并提供一个 PrinterSettings 对象。在 PrinterSettings 中包含了打印机支持的 PaperSize 列表,但不是所有尺寸(注意,XPS 文档驱动程序(win7)支持所有尺寸)。
在我们的情况下,这个受支持大小的子集就是我们所需要的。用户指定的 PaperKind 传递给我们的打印代码,它会查找我们的 PrinterSettings 对象,直到找到用户的选择或放弃并使用默认值。
在下面的示例中,您可以看到 PaperSize 对象被正确地填充。
PrinterSettings settings = new PrinterSettings();
foreach (PaperSize size in settings.PaperSizes)
    Debug.WriteLine(size);

它只是其中一部分,但也许对您来说已经足够了。.NET中的打印API真的很不清楚,而MSDN也没有什么帮助...希望这能为您指明正确的方向!


8

使用LINQ实现您的目标的方法如下:

PrinterSettings printerSettings = new PrinterSettings();
IQueryable<PaperSize> paperSizes = printerSettings.PaperSizes.Cast<PaperSize>().AsQueryable();
PaperSize a4rotated = paperSizes.Where(paperSize => paperSize.Kind == PaperKind.A4Rotated).FirstOrDefault();

祝你好运!


// https://dev59.com/3nTYa4cB1Zd3GeqPt1wg 使用 System.Linq; - udoline

3
public static PaperSize GetPaperSize(string Name)
    {
        PaperSize size1 = null;
        Name=Name.ToUpper();
        PrinterSettings settings = new PrinterSettings();
        foreach (PaperSize size in settings.PaperSizes)
            if (size.Kind.ToString().ToUpper() == Name)
            {
                size1 = size;
                break;
            }
        return size1;            
    }

你需要给你的代码添加一个解释。它是做什么的? - Spero
我已经让它正常工作了,这是目前为止最好的解决方案,但根据这里的惯例,你需要稍微解释一下。 - Spero

1
你可以尝试使用System.Drawing.Printing.PaperSize类。它有一个RawKind属性,可以设置为System.Drawing.Printing.PaperKind。
类似这样的代码:
PaperSize size = new PaperSize();
size.RawKind = (int) PaperKind.A3;

不。在这种情况下,高度和宽度仍为0。 - Oleksandr G
哥们,你会觉得这种情况下应该有某种辅助类吧。http://msdn.microsoft.com/en-us/library/system.drawing.printing.paperkind.aspx 列出了每个纸张类型及其高度和宽度。也许你应该编写一个辅助类并发布出来? - hackerhasid
我看过那个枚举类。但是我不想写任何类,因为可能已经有人写过了。 - Oleksandr G
4
如果这个链接(http://www.dotnetframework.org/default.aspx/DotNET/DotNET/8@0/untmp/whidbey/REDBITS/ndp/fx/src/CommonUI/System/Drawing/Printing/PaperSize@cs/1/PaperSize@cs)是权威的话,似乎有人“认为他们不再需要它”,并注释掉了那段代码(#ifdef false)。我没有仔细阅读过 .NET 源代码,但这种评论并不是令人鼓舞的 :O。 - harpo

1
根据@hackerhasid的评论和研究,我重新制作了已删除的dotnet代码以满足自己的需求,返回一个PaperSize类,而不是原始代码所做的Point结构。
我需要在受限安全环境中使用它,其中打印机访问可能受限。 我发现受限访问会阻止我迭代打印机定义的页面大小。
如果PaperKind未定义或不再受支持,则返回null。
注意: PaperSize类将数字存储为每英寸的百分之一。
    private static PaperSize GetPaperSize(PaperKind kind)
    {
        // NOTE: This code is a resurrected and refactored version of code originally found at:
        // http://www.dotnetframework.org/default.aspx/DotNET/DotNET/8@0/untmp/whidbey/REDBITS/ndp/fx/src/CommonUI/System/Drawing/Printing/PaperSize@cs/1/PaperSize@cs

        var fnInches = new Func<double, double, PaperSize>((width, height) =>
        {
            Debug.Assert(width < 50 && height < 50, "You said inches, but you probably meant millimeters (" + width + ", " + height + ")");
            var ps = new PaperSize(kind.ToString(), (int)(width * 100), (int)(height * 100));
            ps.RawKind = (int)kind;
            return ps;
        });

        var fnMillimeters = new Func<double, double, PaperSize>((width, height) =>
        {
            Debug.Assert(width > 50 && height > 50, "You said millimeters, but you probably meant inches (" + width + ", " + height + ")");
            var ps = new PaperSize(kind.ToString(), (int)(width / 25.4 * 100), (int)(height / 25.4 * 100));
            ps.RawKind = (int)kind;
            return ps;
        });

        switch (kind)
        {
            case PaperKind.Letter: return fnInches(8.5, 11);
            case PaperKind.Legal: return fnInches(8.5, 14);
            case PaperKind.A4: return fnMillimeters(210, 297);
            case PaperKind.CSheet: return fnInches(17, 22);
            case PaperKind.DSheet: return fnInches(22, 34);
            case PaperKind.ESheet: return fnInches(34, 44);
            case PaperKind.LetterSmall: return fnInches(8.5, 11);
            case PaperKind.Tabloid: return fnInches(11, 17);
            case PaperKind.Ledger: return fnInches(17, 11);
            case PaperKind.Statement: return fnInches(5.5, 8.5);
            case PaperKind.Executive: return fnInches(7.25, 10.5);
            case PaperKind.A3: return fnMillimeters(297, 420);
            case PaperKind.A4Small: return fnMillimeters(210, 297);
            case PaperKind.A5: return fnMillimeters(148, 210);
            case PaperKind.B4: return fnMillimeters(250, 354);
            case PaperKind.B5: return fnMillimeters(182, 257);
            case PaperKind.Folio: return fnInches(8.5, 13);
            case PaperKind.Quarto: return fnMillimeters(215, 275);
            case PaperKind.Standard10x14: return fnInches(10, 14);
            case PaperKind.Standard11x17: return fnInches(11, 17);
            case PaperKind.Note: return fnInches(8.5, 11);
            case PaperKind.Number9Envelope: return fnInches(3.875, 8.875);
            case PaperKind.Number10Envelope: return fnInches(4.125, 9.5);
            case PaperKind.Number11Envelope: return fnInches(4.5, 10.375);
            case PaperKind.Number12Envelope: return fnInches(4.75, 11);
            case PaperKind.Number14Envelope: return fnInches(5, 11.5);
            case PaperKind.DLEnvelope: return fnMillimeters(110, 220);
            case PaperKind.C5Envelope: return fnMillimeters(162, 229);
            case PaperKind.C3Envelope: return fnMillimeters(324, 458);
            case PaperKind.C4Envelope: return fnMillimeters(229, 324);
            case PaperKind.C6Envelope: return fnMillimeters(114, 162);
            case PaperKind.C65Envelope: return fnMillimeters(114, 229);
            case PaperKind.B4Envelope: return fnMillimeters(250, 353);
            case PaperKind.B5Envelope: return fnMillimeters(176, 250);
            case PaperKind.B6Envelope: return fnMillimeters(176, 125);
            case PaperKind.ItalyEnvelope: return fnMillimeters(110, 230);
            case PaperKind.MonarchEnvelope: return fnInches(3.875, 7.5);
            case PaperKind.PersonalEnvelope: return fnInches(3.625, 6.5);
            case PaperKind.USStandardFanfold: return fnInches(14.875, 11);
            case PaperKind.GermanStandardFanfold: return fnInches(8.5, 12);
            case PaperKind.GermanLegalFanfold: return fnInches(8.5, 13);

            case PaperKind.JapanesePostcard: return fnMillimeters(100, 148);
            case PaperKind.Standard9x11: return fnInches(9, 11);
            case PaperKind.Standard10x11: return fnInches(10, 11);
            case PaperKind.Standard15x11: return fnInches(15, 11);
            case PaperKind.InviteEnvelope: return fnMillimeters(220, 220);
            //= SafeNativeMethods.DMPAPER_RESERVED_48, 
            //= SafeNativeMethods.DMPAPER_RESERVED_49,
            case PaperKind.LetterExtra: return fnInches(9.275, 12);
            case PaperKind.LegalExtra: return fnInches(9.275, 15);
            case PaperKind.TabloidExtra: return fnInches(11.69, 18);
            case PaperKind.A4Extra: return fnInches(9.27, 12.69);
            case PaperKind.LetterTransverse: return fnInches(8.275, 11);
            case PaperKind.A4Transverse: return fnMillimeters(210, 297);
            case PaperKind.LetterExtraTransverse: return fnInches(9.275, 12);
            case PaperKind.APlus: return fnMillimeters(227, 356);
            case PaperKind.BPlus: return fnMillimeters(305, 487);
            case PaperKind.LetterPlus: return fnInches(8.5, 12.69);
            case PaperKind.A4Plus: return fnMillimeters(210, 330);
            case PaperKind.A5Transverse: return fnMillimeters(148, 210);
            case PaperKind.B5Transverse: return fnMillimeters(182, 257);
            case PaperKind.A3Extra: return fnMillimeters(322, 445);
            case PaperKind.A5Extra: return fnMillimeters(174, 235);
            case PaperKind.B5Extra: return fnMillimeters(201, 276);
            case PaperKind.A2: return fnMillimeters(420, 594);
            case PaperKind.A3Transverse: return fnMillimeters(297, 420);
            case PaperKind.A3ExtraTransverse: return fnMillimeters(322, 445);

            case PaperKind.JapaneseDoublePostcard: return fnMillimeters(200, 148);
            case PaperKind.A6: return fnMillimeters(105, 148);
            case PaperKind.JapaneseEnvelopeKakuNumber2: return fnMillimeters(240, 332);
            case PaperKind.JapaneseEnvelopeKakuNumber3: return fnMillimeters(216, 277);
            case PaperKind.JapaneseEnvelopeChouNumber3: return fnMillimeters(120, 235);
            case PaperKind.JapaneseEnvelopeChouNumber4: return fnMillimeters(90, 205);
            case PaperKind.LetterRotated: return fnInches(11, 8.5);
            case PaperKind.A3Rotated: return fnMillimeters(420, 297);
            case PaperKind.A4Rotated: return fnMillimeters(297, 210);
            case PaperKind.A5Rotated: return fnMillimeters(210, 148);
            case PaperKind.JapanesePostcardRotated: return fnMillimeters(148, 100);
            case PaperKind.JapaneseDoublePostcardRotated: return fnMillimeters(148, 200);
            case PaperKind.A6Rotated: return fnMillimeters(148, 105);
            case PaperKind.JapaneseEnvelopeKakuNumber2Rotated: return fnMillimeters(332, 240);
            case PaperKind.JapaneseEnvelopeKakuNumber3Rotated: return fnMillimeters(277, 216);
            case PaperKind.JapaneseEnvelopeChouNumber3Rotated: return fnMillimeters(235, 120);
            case PaperKind.JapaneseEnvelopeChouNumber4Rotated: return fnMillimeters(205, 90);
            case PaperKind.Standard12x11: return fnInches(12, 11);
            case PaperKind.JapaneseEnvelopeYouNumber4: return fnMillimeters(105, 235);
            case PaperKind.JapaneseEnvelopeYouNumber4Rotated: return fnMillimeters(235, 105);

            default:
                return null;
        }
    }  

1
PaperSize pkSize;
PrintDocument printDoc = new PrintDocument();
for (int i = 0; i < printDoc.PrinterSettings.PaperSizes.Count; i++)
{
    pkSize = printDoc.PrinterSettings.PaperSizes[i];
    cmbPaperSize.Items.Add(pkSize);
}

2
在你的答案中添加一个小解释来解释它为什么有效。 - Morgoth
使用 System.Drawing.Printing; - SHALU P SHAJAN

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