使用PrintDocument打印多个页面

我正在尝试打印发票。 发票应该可以打印在多个页面上,但这就是问题所在。我可以在一个页面上完美地打印发票,但是一旦发票不适合单个页面,打印工作就会退出第一页。

这是我正在使用的代码。 ‘artikelen’是一个文章列表(列表)。 我已经阅读了几个类似的例子,我很确定我在这里遗漏了一些东西。

(编辑:删除了一些不必要的代码)

public void PrintA4Factuur() { p = new PrintDocument(); p.PrintPage += new PrintPageEventHandler(printPage); printPreviewDialog.Document = p; printPreviewDialog.ShowDialog(); } void printPage(object sender1, PrintPageEventArgs e1) { Graphics g = e1.Graphics; int yPos = 320; float pageHeight = e1.MarginBounds.Height; int artikelPosition = 0; while (yPos + 100 < pageHeight && artikelPosition < this.artikelen.Count) { // Do stuff with articles (printing details in different rectangles artikelPosition += 1; yPos += 20; } if (artikelPosition < this.artikelen.Count) { e1.HasMorePages = true; return; } else { e1.HasMorePages = false; } } 

我发现你的代码反其道而行之:如果它打印多个页面,它会继续打印到无穷大。

尝试将您的索引位置变量移动到PrintPage事件之外,因为将其设置回零只是将其再次设置为开头:

 int artikelPosition = 0; 

开始打印时重置它:

 public void PrintA4Factuur() { artikelPosition = 0 p = new PrintDocument(); p.PrintPage += printPage; printPreviewDialog.Document = p; printPreviewDialog.ShowDialog(); } 

然后在PrintPage例程中注释掉它:

 void printPage(object sender1, PrintPageEventArgs e1) { Graphics g = e1.Graphics; int yPos = 320; float pageHeight = e1.MarginBounds.Height; // int artikelPosition = 0; // continue with code } 

好吧,Lars指出了在每个页面的开头将artikelPosition重置为零的问题,但是这个代码还存在一些其他问题。

您应该始终使用e1.MarginBounds作为坐标,因为用户可以更改边距,而p.DefaultPageSettings将不包含该边距。

使用像GetHeight(yourDeviceGraphPort)这样的字体指标,不要硬编码行高。

始终使用float s作为坐标,不要在int之间转换。

字体是非托管资源,您必须在完成后对其进行处理。 在循环中重复创建和处理字体是低效的; 在调用PrintDocument.Print()之前构造它,并在打印PrintDocument.Print()所有页面后对其进行处理。

System.Drawing还定义了一个Black SolidBrush。