基于C#中使用的坐标,使用System.Drawing.Printing在多个页面上打印图形

本文关键字:Printing 图形 打印 Drawing System 使用 坐标 基于 | 更新日期: 2023-09-27 17:58:20

使用System.Drawing.Printing,我想在打印文档上打印一组行。但问题是,它会打印第一页上的每一行,坐标是多少,如果我画一张图像,它会在一页上打印,无论它有多大

以下是我为在多页上打印文本所做的操作:

protected void ThePrintDocument_PrintPage (object sender, System.Drawing.Printing.PrintPageEventArgs ev)
{
  float linesPerPage = 0;
  float yPosition = 0;
  int count = 0;
  float leftMargin = ev.MarginBounds.Left;
  float topMargin = ev.MarginBounds.Top;
  string line = null;
  Font printFont = this.richTextBox1.Font;
  SolidBrush myBrush = new SolidBrush(Color.Black);
  // Work out the number of lines per page, using the MarginBounds.
  linesPerPage = ev.MarginBounds.Height / printFont.GetHeight(ev.Graphics);
  // Iterate over the string using the StringReader, printing each line.
  while(count < linesPerPage && ((line=myReader.ReadLine()) != null)) 
  {
    // calculate the next line position based on 
    // the height of the font according to the printing device
    yPosition = topMargin + (count * printFont.GetHeight(ev.Graphics));
    // draw the next line in the rich edit control
    ev.Graphics.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat());
    count++;
  }
  // If there are more lines, print another page.
  if(line != null)
    ev.HasMorePages = true;
  else
    ev.HasMorePages = false;
  myBrush.Dispose();
}

我应该做什么才能在多页上打印行,即以下代码应该在两页上打印,因为行的长度是1400,打印文档的长度是1100,所以行的剩余300应该打印在下一页上

protected void ThePrintDocument_PrintPage (object sender, System.Drawing.Printing.PrintPageEventArgs ev)
{
    Pen P1 = new Pen(Brushes.Violet, 5);
    ev.Graphics.DrawLine(P1, new Point(0,0), new Point(500,1400));
}

基于C#中使用的坐标,使用System.Drawing.Printing在多个页面上打印图形

这不是.NET中打印的工作方式。它不会因为在当前页面的坐标之外打印而创建新页面。.NET使用一些事件和事件参数来询问您的文档将包含多少页。然后,它将调用为每个页面打印页面的事件

有关示例,请参见此处。

编辑
好吧,回复你的评论,我可以想出两个可能的解决方案:第一个解决方案涉及剪切:将图形对象与页面的矩形相交,然后只打印它们共同的内容。如果剪切区域外有零件,请将该零件作为新的图形对象,然后再次剪切以在新页面上打印。重复此操作,直到剩余的图形适合页面矩形。然而,我想不出一种容易做到这一点的方法。

我的第二个想法如下:

  1. 通过将图形对象的边界矩形除以一页的"视觉矩形"的高度来计算打印所有图形对象所需的页数(如果此划分中有剩余部分,则将页数增加一)
  2. 循环以下内容直到到达最后一页
    • 将所有图形对象打印到当前页面
    • 将所有y坐标减小页面的"视觉高度"(有效地将图形对象向上移动到"纸张边界"之外)

虽然打印每页的整个图形对象列表的开销可能很高,但您将剪切部分留给打印机驱动程序/打印机本身。