我有一些自定义Windows窗体,动态加载每个窗体并使用System.Drawing.Printing.PrintDocument
打印窗体控件值。
我的问题是,我有超过700页要打印,如果打印超过300页我出现内存不足问题,如何使用System.Drawing.Printing
打印超过700页
答案 0 :(得分:0)
PrintDocument 有 OnBeginPrint (),您可以在继承的类中覆盖它(或作为订阅它的事件处理)。它传递的参数可以告诉你这个打印是预览还是实际打印(实际上有3个值: PrintToFile , PrintToPreview 和 PrintToPrinter ) 。您可以通过这种方式区分打印的目的。此外,您唯一需要知道的是,当您预览文档时, OnPrintPage ()将连续调用700次,在内存中构建整个文档;当您实际打印文档到打印机时,在调用 OnPrintPage ()后,它将不会将所有以前的页面保留在内存中。这就是为什么要打印任何你真正需要内存的文件来存储它占用大量内存的页面。
所以你需要的是在预览时绘制简化的页面内容,并在实际打印时完全绘制页面。
下一个示例说明了我的方法:
class PrintDocument1 : PrintDocument
{
int currentPage;
bool isPreview;
protected override void OnBeginPrint(PrintEventArgs e)
{
currentPage = 0;
isPreview = e.PrintAction == PrintAction.PrintToPreview;
}
protected override void OnPrintPage(PrintPageEventArgs e)
{
currentPage++;
if (isPreview)
{
// simplified page drawing
e.Graphics.FillRectangle(Brushes.BurlyWood, e.MarginBounds);
e.Graphics.DrawString("Page #" + currentPage, SystemFonts.CaptionFont, Brushes.Black, e.MarginBounds.Location);
}
else
{
// full page drawing
Bitmap[] bmaps = new Bitmap[] {
SystemIcons.Application.ToBitmap(),
SystemIcons.Information.ToBitmap(),
SystemIcons.Question.ToBitmap(),
SystemIcons.Warning.ToBitmap(),
SystemIcons.Shield.ToBitmap(),
SystemIcons.Error.ToBitmap()
};
Point p = e.MarginBounds.Location;
for (int i = 0; p.Y < e.MarginBounds.Bottom; i++, p.Y += 40)
{
e.Graphics.DrawString("Some text goes here, line " + (i + 1), SystemFonts.CaptionFont, Brushes.Black, p);
e.Graphics.DrawLine(Pens.CadetBlue, e.MarginBounds.Left, p.Y, e.MarginBounds.Right, p.Y);
for (int j = 0; j < bmaps.Length; j++)
e.Graphics.DrawImage(bmaps[j], p.X + 200 + j * 40, p.Y);
}
}
e.HasMorePages = currentPage < 700; // a lot of pages to draw
}
}
// above class can be previewed and printed next way:
// PrintPreviewDialog d = new PrintPreviewDialog();
// d.Document = new PrintDocument1();
// d.ShowDialog();