使用 PrintDocument 打印多页

Ste*_*fan 3 .net c# printing

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

这是我正在使用的代码。'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;
        }
}
Run Code Online (Sandbox Code Playgroud)

Dou*_*rch 5

artikelPosition好吧,拉尔斯指出了在每页开头重置为零的问题,但是这段代码还有一些其他问题。

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

使用诸如 之类的字体规格GetHeight(yourDeviceGraphPort),不要对行高进行硬编码。

始终使用floats 表示坐标,不要在ints 之间进行转换。

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

还有一个 Black SolidBrush 已在 中定义System.Drawing