Печать в .NET - Преобразование из миллиметра в пиксель - PullRequest
5 голосов
/ 11 октября 2011

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

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

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.Textзначение «9,5» и edtBorderTop.Text значение «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.Parse (edtBorderLeft.Text), dpiX) edtBorderLeft.Text = "9,5" dpiX = 600;возвращает: 224

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

Ответы [ 2 ]

6 голосов
/ 11 октября 2011

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

 e.Graphics.PageUnit = GraphicsUnit.Millimeter;

или

e.Graphics.PageUnit = GraphicsUnit.Pixel;

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

5 голосов
/ 01 августа 2013

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

Поэтому для принтера вместо использования dpiX / dpiY можно принять значение 100, но, вероятно, безопаснее установить единицы в миллиметры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...