c# - PrintDocument 是否将整个文档发送到打印机或逐行发送?
问题描述
一点上下文:我正在开发一个 Windows 窗体应用程序,其中包含用户打印一些信息的功能。
问题是这些信息的大小可能会不时改变:有时它可以放在一个页面上,有时它可能是 20 多页。
对于印刷品,我使用的是 .NetPrintDocument
所以我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 页?
解决方案
一些提示:
您使用的所有这些绘图类(图形、字体等)都是 Win32 GDI 对象的包装器,并且是一次性的。如果你不 Dispose 这些东西,可能会发生意想不到的结果。阅读“使用”声明和 IDisposable,并确保正确清理。您不是逐行打印;您正在逐页打印(因此是 PrintPage 事件)。您应该能够打印很多页。
推荐阅读
- java - 如何在 Java 中启用 TLS_ECDHE_ECDSA_WITH_AES_128_CCM 和 TLS_ECDHE_ECDSA_WITH_AES_256_CCM 密码套件?
- android - 何时使用 JobIntentService 与 WorkManager?
- excel - Excel:在 1 行中重复,在另一行中是唯一的。每当重复项中存在给定的唯一值时,在另一行中标记
- python - 使用 SAT 求解器 (Python) 查找特定区域内的所有自由多骨牌组合
- python - 如何正确解析 XML 属性并使用 Python 追加到列表中?
- woocommerce - 使连锁产品适用于以编程方式添加的订单
- javascript - 如何使用 Selenium Python (MacOS) 用自定义文本替换按钮文本?
- r - R 中的 cv.glmnet 是否接受二元因子特征?
- javascript - 函数正在返回 [object Object]
- ruby-on-rails - 如何检查控制器参数中的空值?(Ruby on Rails 5)- 已修复