代码之家  ›  专栏  ›  技术社区  ›  Adan Sandoval

打印文档是将整个文档发送到打印机还是逐行发送?

  •  2
  • Adan Sandoval  · 技术社区  · 6 年前

    一点背景:我正在开发一个Windows窗体应用程序,其中包含一个用户打印一些信息的功能。

    问题是,这些信息的大小可能会不时变化:有时可以放在一页上,有时可以是20多页。

    PrintDocument

    所以我用 e.HasMorePages 以处理可能的多个页面。下面是我的代码的简化版本:

    int printIndex = 0;
    
    private void startPrinting(){
        PrintDocument printDoc = new PrintDocument();
        printDoc.PrinterSettings.PrinterName = "Ticket printer1"
    
        printDoc.PrintPage += new PrintPageEventHandler(printPage);
        printDoc.Print();
    }
    

    以及 printPage 方法:

    private void printPage(object sender, PrintPageEventArgs e)
    {
        Graphics graphics = e.Graphics;
        int yPos = 0;
        Font regular = new Font(FontFamily.GenericSansSerif, 10.0f, FontStyle.Regular);
    
        for(int i = printIndex; i < data.Length; i++)
        {
            if (yPos + 30 >= e.PageBounds.Height)
            {
                e.HasMorePages = true;
                return;
            }
            else
            {
                e.HasMorePages = false;
            }
            graphics.DrawString(data[i], regular, Brushes.Black, yPos, 110);
            yPos += 20;
            printIndex++;
        }
        regular.Dispose();
        graphics.Dispose();
    }
    

    这在虚拟打印机甚至办公室里的一些物理打印机上都能正常工作。但当用户在自己的电脑上运行应用程序时(使用实际的打印机),它打印的页面不超过3页。

    它是怎么工作的?如果是的话:我怎么能把它改成打印3页以上呢?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Flydog57    6 年前

    一些提示:

    您正在使用的所有绘图类(图形、字体等)都是Win32 GDI对象的包装器,可以随意使用。如果你不处理这些东西, 想不到的 结果可能会发生。仔细阅读“using”语句和IDisposable,并确保正确清理。不是逐行打印;而是逐页打印(因此是PrintPage事件)。你应该可以打印 许多 共页。