【问题标题】:How to get predefined paper size by PaperKind如何通过 PaperKind 获取预定义的纸张尺寸
【发布时间】:2011-01-02 02:05:21
【问题描述】:

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

【问题讨论】:

    标签: c# .net printing


    【解决方案1】:

    可以通过迭代 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 也没有太大帮助……希望它能让您走上正轨!

    【讨论】:

      【解决方案2】:

      实现目标的 LINQ 方法如下所示:

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

      祝你好运!

      【讨论】:

      【解决方案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;            
          }
      

      【讨论】:

      • 您需要在代码中添加说明。它有什么作用?
      • 我得到了它,这是迄今为止最好的解决方案,但根据这里的实践,你需要稍微解释一下。
      【解决方案4】:

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

      类似:

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

      【讨论】:

      • 没有。在这种情况下,高度和宽度仍然是 0。
      • 伙计,你会认为有一些帮助类。 msdn.microsoft.com/en-us/library/… 列出每个 PaperKind 以及高度和宽度。也许你应该写一个帮助类并发布它?
      • 我见过那个枚举类。但我不想写任何类,因为可能已经写好了。
      • @hackerhasid,如果this 具有权威性,那么似乎有人“认为他们不再需要它”,并准确地注释掉了该代码(#ifdef false)。我还没有阅读大量的 .NET 源代码,但这并不是一种令人鼓舞的评论:O
      【解决方案5】:
      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);
      }
      

      【讨论】:

      • 在你的答案中添加一个小解释来解释它为什么起作用。
      • 使用 System.Drawing.Printing;
      【解决方案6】:

      通过 @hackerhasid 进行 cmets 和研究,我出于自己的目的重新设计了 deleted dotnet code,返回了一个 PaperSize 类,而不是由原代码。

      我需要在打印机访问受限的受限安全环境中使用它。我发现受限访问阻止我迭代打印机定义的页面大小。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-13
        • 1970-01-01
        • 2010-10-15
        • 1970-01-01
        相关资源
        最近更新 更多