C#PrintDocument对齐右下角

时间:2014-01-22 21:35:31

标签: c# winforms alignment printdocument

我正在使用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);
}

1 个答案:

答案 0 :(得分:0)

首先你必须决定你想要的:

  1. 在固定的2英寸空间内打印。
  2. 打印尽可能多的高度以容纳所有文字。
  3. 如果选择#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);