使用“打印文档”打印多页

本文关键字:打印 文档 使用 打印文档 | 更新日期: 2023-09-27 18:31:45

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

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

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

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;
        }
}

使用“打印文档”打印多页

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

您应该始终使用e1.MarginBounds对于坐标,因为用户可以更改边距,p.DefaultPageSettings不会包括该边距。

使用字体指标,如GetHeight(yourDeviceGraphPort),不要硬编码行高。

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

字体是非托管资源,使用完字体后必须Dispose字体。在循环中重复创建和处置字体效率低下;在调用PrintDocument.Print()之前构建它,并在打印所有页面后处理它。

还有一个黑色的SolidBrush已经在System.Drawing中定义。

我发现你的代码做了相反的事情:如果它打印多页,它将继续打印到无穷大。

尝试将索引位置变量移到 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
}