我正在尝试测量某些文本的高度以用于打印目的。
这是代码。在我的情况下,它在预览和实际页面上打印不同的数字。 我现在不能尝试除Microsoft Office Document Image Writer以外的任何打印机,但我很确定它不是打印机问题。
也许有人找到了解决此问题的方法?
private void button1_Click(object sender, EventArgs e)
{
Print();
}
public void Print()
{
PrintDocument my_doc = new PrintDocument();
my_doc.PrintPage += new PrintPageEventHandler(this.PrintPage);
PrintPreviewDialog my_preview = new PrintPreviewDialog();
my_preview.Document = my_doc;
my_preview.ShowDialog();
my_doc.Dispose();
my_preview.Dispose();
}
private void PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
e.Graphics.PageUnit = GraphicsUnit.Pixel;
string s = "String height is ";
SizeF h = e.Graphics.MeasureString(s, new Font("Arial", 24));
e.Graphics.DrawString(s + Convert.ToString(h.Height),
new Font("Arial", 24), new SolidBrush(Color.Black), 1, 1);
}
答案 0 :(得分:1)
我猜问题是System.Drawing.Graphics基于GDI +,实际打印基于GDI。
您可以替换对MeasureString的调用以使用基于GDI的方法:
SizeF hT = TextRenderer.MeasureText(s, new Font("Arial", 24));
System.Windows.Forms.TextRenderer 开发课程是为了提供 对复杂的支持水平相同 Windows窗体中的脚本控制它 我们期望从Windows操作 系统。此TextRenderer基于 GDI文本呈现API,它使用 Windows Unicode脚本处理器 (的Uniscribe)。 [from MSDN]
有关详细信息,请参阅MSDN杂志关于文本呈现的这篇好文章:
Text Rendering: Build World-Ready Apps Using Complex Scripts In Windows Forms Controls
答案 1 :(得分:0)
在PrintPage事件中尝试除Graphics.Pixel之外的PageUnit。英寸,毫米或点(以及其他)应该在预览或打印出来时给你相同的结果。由于预览屏幕和打印机具有不同的像素分辨率,因此我不希望使用像素。
答案 2 :(得分:0)
我已经尝试了所有可用的PageUnits,但它没有任何区别。预览高度与打印高度比约为1.029336并且它是恒定的。
PS。其实我找到了解决方法。我使用MeasureString来计算行数,然后将它乘以从Font类派生的字符高度,以计算文本块的高度。它适用于一些调整。
答案 3 :(得分:0)
我想我可以解决你的问题...我知道如何解决它,更多的人不太了解它的原因。
问题是字符之间的间距。例如,如果您使用“" VA"在她的印刷上(或者你在' Graphics.FromImage')的字母' A'在字母' V'之后开始。 ...在' PrintPreview'这封信' A'就在字母“#39; V' ...如果你将单个字母加在' PrintPreview',您将达到相同的打印结果!