3

我正在尝试测量某些文本的高度以用于表格打印目的。

这是代码。就我而言,它在预览和实际页面上打印不同的数字。我现在无法尝试使用 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);
    }
4

4 回答 4

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)。[来自 MSDN]

有关更多详细信息,请参阅 MSDN 杂志上关于文本渲染的这篇好文章:

文本渲染:使用 Windows 窗体控件中的复杂脚本构建全球通用的应用程序

于 2008-12-09T21:23:24.433 回答
0

我已经尝试了所有可用的 PageUnit,但没有任何区别。预览高度与打印高度的比率约为 1.029336,并且是恒定的。

PS。其实我已经找到了解决方法。我使用 MeasureString 来计算行数,然后将其乘以从 Font 类派生的字符高度,以计算文本块的高度。它可以很好地进行一些调整。

于 2008-11-19T06:22:51.513 回答
0

在 PrintPage 事件中尝试使用 Graphics.Pixel 以外的 PageUnit。英寸、毫米或点(以及其他)应该在预览或打印输出中为您提供相同的结果。像素我不希望,因为预览屏幕和打印机有不同的像素分辨率。

于 2008-11-19T06:00:34.757 回答
0

我想我可以解决你的问题......我知道如何解决它,更多的是不太了解它的原因。

问题是字符之间的间距。例如,如果您在她的印刷品上使用“VA”一词(或者当您使用“Graphics.FromImage”时),字母“A”就在字母“V”之后开始......在“PrintPreview”中,字母“A”从字母'V'内部开始......如果将'PrintPreview'中的各个字母相加,您将获得相同的打印结果!

于 2015-04-03T01:25:35.563 回答