Печать в .NET — преобразование из миллиметра в пиксель

#c# #printing

#c# #печать

Вопрос:

Как я могу преобразовать пользовательский ввод из миллиметра в пиксели, чтобы он печатался в нужной позиции страницы?

Я использую следующий код:

 private void document_PrintPage(object sender, PrintPageEventArgs e)
{
    float dpiX = e.Graphics.DpiX;
    float dpiY = e.Graphics.DpiY;
    Point p = new Point(mmToPixel(float.Parse(edtBorderLeft.Text), dpiX), 
            mmToPixel(float.Parse(edtBorderTop.Text), dpiY));
    e.Graphics.DrawImage(testImage, p);

}

private int mmToPixel(float mm, float dpi)
{
    return (int)Math.Round((mm / 25.4)  * dpi);
}
  

edtBorderLeft.Текст получил значение «9.5» и edtBorderTop.Введите значение «21,5». Эти значения равны миллиметрам. Если я проверю вывод с помощью этого кода:

     private void printPage()
    {
        PrintDialog dialog = new PrintDialog();
        dialog.Document = document;
        if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            PrintPreviewDialog preview = new PrintPreviewDialog();
            preview.Document = document;
            preview.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
            preview.Show();
            //document.Print();
        }            
    }
  

Изображение отображается почти в центре страницы. Пример вычисления:

mmToPixel(float.Синтаксический анализ (edtBorderLeft.Text), DpiX) edtBorderLeft.Text = «9.5» DpiX = 600; возвращает: 224

Как я могу вычислить правильную точку для печатного изображения?

Комментарии:

1. не могли бы вы попробовать TextRender. measureText(); и посмотрите, может ли это что-то сделать в этом случае

2. Спасибо за вашу помощь. Я нашел другое решение. Пожалуйста, посмотрите на мой ответ.

Ответ №1:

Я нашел решение. Вы можете изменить единицу страницы с помощью следующего кода. Так что мне не нужно преобразование:

  e.Graphics.PageUnit = GraphicsUnit.Millimeter;
  

или

 e.Graphics.PageUnit = GraphicsUnit.Pixel;
  

и я могу использовать приведенный выше код.

Ответ №2:

Просто чтобы добавить небольшое объяснение. По умолчанию используется графика.Для PageUhit установлено значение «Отображать». Для экранного дисплея это обычно означает 96 пикселей на дюйм, для принтера это 100 точек на дюйм. Эта информация каким-то образом скрыта в MSDN, но ее трудно найти.

Поэтому для принтера вместо использования DpiX / DpiY вы могли бы принять значение 100, но, вероятно, безопаснее установить единицы измерения в миллиметрах.