【发布时间】:2018-08-22 22:47:53
【问题描述】:
一点上下文:我正在开发一个 Windows 窗体应用程序,其中包含用户打印一些信息的功能。
问题在于,这些信息的大小会不时发生变化:有时它可以放在一个页面上,有时可能是 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 页?
【问题讨论】:
-
我认为这可能取决于打印驱动程序,尽管您可能想要使用打印假脱机设置
print after last page is spooled和start printing immediately。 Postscript、PCL、HPGL 将打印工作分解为打印机可以理解的特殊语言,Windows 假脱机可以正常工作,以便打印机可以有序地处理它。我不确定是否是这种情况,但您这样做的方式可能是尝试一次将 20 页(作为 1 页)发送到打印机并且内存不足。 -
自 Windows 3.x 时代以来,我还没有见过不能处理超过 3 页的打印机,包括旧的点阵和热敏收据打印机。
-
您使用的所有绘图类(图形、字体等)都是 Win32 GDI 对象的包装器,并且是一次性的。如果你不 Dispose 这些东西,可能会发生意想不到的结果。阅读“使用”声明和 IDisposable,并确保正确清理。您不是逐行打印;您正在逐页打印(因此是 PrintPage 事件)。您应该能够打印很多页。
-
@Flydog57 编辑了问题,显示了我处理这些对象的方式(我之前忘记包含这些行,但它们实际上在我的代码中)但我刚刚意识到这些行的大部分迭代是没有被叫,谢谢你的建议。它实际上解决了问题,请将其作为答案发布,请将其标记为已解决。
标签: c# printing printdocument