【问题标题】:Using PrintDocument to print multiple pages使用 PrintDocument 打印多页
【发布时间】:2012-04-19 15:48:49
【问题描述】:

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

这是我正在使用的代码。 '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;
        }
}

【问题讨论】:

    标签: c# .net printing


    【解决方案1】:

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

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

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

    始终使用floats 作为坐标,不要在ints 之间转换。

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

    System.Drawing 中已经定义了一个 Black SolidBrush。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 成功了。这是打自己一巴掌的好时机。非常感谢!回顾一下,printPage() 方法是为每一页而不是每一个打印作业调用的,对吧?这可以解释我的错误。
      • @StefanM 没错。这就是为什么将 yPos 保留在 printPage 方法中的原因,因为这是打印线条的起点。
      猜你喜欢
      • 2013-06-01
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多