C# 如何通过 PaperKind 获取预定义的纸张尺寸

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2013630/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-06 22:39:50  来源:igfitidea点击:

How to get predefined paper size by PaperKind

c#.netprinting

提问by Alexander G

I need to get paper size by System.Drawing.Printing.PaperKind. Are there any predefined values? I don't want to hardcode or calculate paper sizes, I just want to get it programmatically. Thanks.

我需要通过 System.Drawing.Printing.PaperKind 获取纸张尺寸。是否有任何预定义值?我不想硬编码或计算纸张尺寸,我只想以编程方式获取它。谢谢。

采纳答案by Matt Jacobsen

A subset of predefined values can be had by iterating over a PrinterSettings.PaperSizescollection.

可以通过迭代PrinterSettings.PaperSizes集合来获得预定义值的子集。

Our application has the user select a printer, providing us with a PrinterSettingsobject. Contained within PrinterSettingsis a list of PaperSize's supported by the printer - not everything (note that the XPS Document Driver (win7) supports all sizes).

我们的应用程序让用户选择一台打印机,为我们提供一个PrinterSettings对象。其中包含打印机支持PrinterSettingsPaperSize's列表- 不是所有内容(请注意,XPS 文档驱动程序 (win7) 支持所有尺寸)。

In our case this subset of supported sizes is all we need. A user specified PaperKindis passed to our printing code, and it goes through our PrinterSettingsobject until it either finds the user's selection or gives up and uses a default.

在我们的例子中,这个支持大小的子集就是我们所需要的。指定的用户PaperKind被传递给我们的打印代码,它遍历我们的 PrinterSettings对象,直到它找到用户的选择或放弃并使用默认值。

In the example below you can see that the PaperSizeobjects are correctly filled.

在下面的示例中,您可以看到PaperSize对象已正确填充。

PrinterSettings settings = new PrinterSettings();
foreach (PaperSize size in settings.PaperSizes)
    Debug.WriteLine(size);

It's only a subset, but maybe that's also enough for you. the printing APIs in .NET are really unclear and msdn isn't really much help... Hopefully it puts you on the right track!

这只是一个子集,但也许这对你来说也足够了。.NET 中的打印 API 真的不清楚,而 msdn 也没有多大帮助...希望它能让您走上正轨!

回答by hackerhasid

You might try the System.Drawing.Printing.PaperSize class. There's a RawKind property which can be set to a System.Drawing.Printing.PaperKind.

您可以尝试 System.Drawing.Printing.PaperSize 类。有一个 RawKind 属性可以设置为 System.Drawing.Printing.PaperKind。

Something like:

就像是:

PaperSize size = new PaperSize();
size.RawKind = (int) PaperKind.A3;

回答by 321X

A LINQ way to achieve your goal is something like this:

实现目标的 LINQ 方法是这样的:

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

Good luck!

祝你好运!

回答by Amr Mausad

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;            
    }

回答by SHALU P SHAJAN

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);
}

回答by AnthonyVO

Taking the comments and research by @hackerhasid, I reworked the deleted dotnet codefor my own purposes returning a PaperSizeclass instead of a Pointstructure as done by the original code.

根据@hackerhasid的评论和研究,我出于自己的目的重新编写已删除的 dotnet 代码,返回PaperSize类而不是原始代码所做的Point结构。

I needed this in restricted security environments where printer access might be limited. I found that the restricted access prevented me from iterating over printer defined page sizes.

在打印机访问可能受限的受限安全环境中,我需要这样做。我发现受限访问阻止我迭代打印机定义的页面大小。

A null is returned if the PaperKind is undefined or no longer supported.

如果 PaperKind 未定义或不再受支持,则返回 null。

NOTE: The PaperSizeclass stores the numbers as hundredths of an inch.

注意: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;
        }
    }