PrintDocument是否将整个文档发送到打印机或逐行发送?

时间:2018-08-22 22:47:53

标签: c# printing printdocument

一个小背景:我正在开发一个Windows Form应用程序,该应用程序包含一个功能,用户可以在其中打印一些信息。

问题在于该信息的大小可能会不时发生变化:有时它可以容纳在单个页面上,有时可能会超过20页。

对于印刷,我使用的是.Net的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页。

我问了一位同行,他建议Windows将整个文档发送到打印机,也许某些打印机由于内存不足而无法处理大文档。

它是如何工作的?如果是,该如何解决,以使其打印多于3页?

1 个答案:

答案 0 :(得分:1)

一些提示:

您正在使用的所有这些绘图类(图形,字体等)都是Win32 GDI对象的包装,并且是可使用的。如果您不丢弃这些东西,可能会发生意外结果。阅读“ using”语句和IDisposable的内容,并确保正确进行清理。您不是逐行打印;您正在逐页打印(因此有PrintPage事件)。您应该能够打印很多页。