我正在使用PrintDocument在页面的右下角打印一些文本。我目前的起始顶部位置是距离底部约2英寸的静态位置。我遇到的问题是文本打印下来,如果它有几行,那么它会被切断页面。
我想要实现的解决方案是将start设置为页面的底部,打开文本,这样就不会被裁剪。
有没有人在做过这样的事情?
这是我的代码
private void StampPrintPage(object sender, PrintPageEventArgs e)
{
string fontFamily = "Courier New";
float xOffset = 0; // Right Offset
float yOffset = 0; // Top Offset
float normalSize = 7.0F;
float mediumSize = 9.0F;
float largerSize = 10.0F;
// Detailed Information
foreach (DataGridViewRow item in this.dgTest.Rows)
{
this.StampPrintLine(e, item.cell[0].value, fontNormal, ref xOffset, ref yOffset);
}
// Indicate that no more data to print, and the Print Document can now send the print data to the spooler.
e.HasMorePages = false;
}
private void StampPrintLine(PrintPageEventArgs e, string lineText, Font lineFont, ref float xOffset, ref float yOffset)
{
StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Center;
e.Graphics.DrawString(lineText, lineFont, Brushes.Black, xOffset, yOffset, format);
StampIncrementOffset(ref yOffset, lineFont, e);
return;
}
private void StampIncrementOffset(ref float yOffset, Font lineFont, PrintPageEventArgs e)
{
yOffset += lineFont.GetHeight(e.Graphics);
}
答案 0 :(得分:0)
首先你必须决定你想要的:
如果选择#1,你的空间不灵活,裁剪是不可避免的。
如果您选择#2,则需要计算总高度,然后根据以下内容设置起点:
这不是一个有效的例子,但应该足以让你前进:
String strLines = String.Empty;
foreach (DataGridViewRow item in this.dgTest.Rows)
{
if (!String.IsNullOrEmpty(strLines))
strLines += "\n";
strLines += item.Cells[0].Value;
}
Size proposedSize = new Size(100, 100); //maximum size you would ever want to allow
StringFormat flags = new StringFormat(StringFormatFlags.LineLimit); //wraps
Size textSize = TextRenderer.MeasureText(strLines, fontNormal, proposedSize, flags);
Int32 xOffset = e.MarginBounds.Right - textSize.Width; //pad?
Int32 yOffset = e.MarginBounds.Bottom - textSize.Height; //pad?
e.Graphics.DrawString(strLines, fontNormal, Brushes.Black, xOffset, yOffset, flags);