基于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));
}
这不是.NET中打印的工作方式。它不会因为在当前页面的坐标之外打印而创建新页面。.NET使用一些事件和事件参数来询问您的文档将包含多少页。然后,它将调用为每个页面打印页面的事件。
有关示例,请参见此处。
编辑
好吧,回复你的评论,我可以想出两个可能的解决方案:第一个解决方案涉及剪切:将图形对象与页面的矩形相交,然后只打印它们共同的内容。如果剪切区域外有零件,请将该零件作为新的图形对象,然后再次剪切以在新页面上打印。重复此操作,直到剩余的图形适合页面矩形。然而,我想不出一种容易做到这一点的方法。
我的第二个想法如下:
- 通过将图形对象的边界矩形除以一页的"视觉矩形"的高度来计算打印所有图形对象所需的页数(如果此划分中有剩余部分,则将页数增加一)
- 循环以下内容直到到达最后一页
- 将所有图形对象打印到当前页面
- 将所有y坐标减小页面的"视觉高度"(有效地将图形对象向上移动到"纸张边界"之外)
虽然打印每页的整个图形对象列表的开销可能很高,但您将剪切部分留给打印机驱动程序/打印机本身。