Высота строки, измеренная с помощью MeasureString в PrintPreviewDialog, отличается от фактической печати - PullRequest
3 голосов
/ 19 ноября 2008

Я пытаюсь измерить высоту текста для печати таблицы.

Вот код. В моем случае он печатает разные номера в предварительном просмотре и на реальной странице. Я не могу сейчас попробовать другие принтеры, кроме 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 ]

1 голос
/ 10 декабря 2008

Полагаю, проблема в том, что System.Drawing.Graphics основан на GDI +, тогда как фактическая печать основана на GDI.

Вы можете заменить вызов MeasureString для использования метода на основе GDI:

SizeF hT = TextRenderer.MeasureText(s, new Font("Arial", 24));

System.Windows.Forms.TextRenderer класс был разработан, чтобы обеспечить тот же уровень поддержки для комплекса скрипты в Windows Forms контролируют мы ожидаем от операционной системы Windows система. Этот TextRenderer основан на API рендеринга текста GDI, который использует Windows Unicode Script Processor (Uniscribe). [из MSDN]

Подробнее об этой хорошей статье в журнале MSDN о рендеринге текста:

Рендеринг текста: Создание готовых к работе приложений с использованием сложных сценариев в элементах управления Windows Forms

0 голосов
/ 03 апреля 2015

Я думаю, что смогу решить вашу проблему ... Я знаю, как это исправить, больше не совсем понял причину этого.

Проблема заключается в расстоянии между символами. Если вы используете, например, слово «VA» при ее печати (или когда вы «Graphics.FromImage»), буква «A» начинается сразу после буквы «V» ... В «PrintPreview» буква «A» начинается непосредственно внутри буквы «V» ... Если вы сложите отдельные буквы в «PrintPreview», вы получите тот же результат печати!

0 голосов
/ 19 ноября 2008

Я перепробовал все доступные PageUnits, но это не имело никакого значения. Отношение высоты предварительного просмотра к высоте печати составляет около 1,029336 и является постоянным.

PS. На самом деле я нашел обходной путь. Я использую MeasureString для подсчета количества строк, а затем умножаю его на высоту символа, полученную из класса Font, для подсчета высоты фрагмента текста. Хорошо работает с некоторыми настройками.

0 голосов
/ 19 ноября 2008

Попробуйте использовать PageUnit, отличный от Graphics.Pixel, в вашем событии PrintPage. Дюйм, Миллиметр или Точка (среди прочих) должны дать вам тот же результат в режиме предварительного просмотра или распечатаны. Пиксель я бы не ожидал, поскольку экран предварительного просмотра и принтер имеют разное разрешение пикселей.

...