Как мне распечатать открытый текст из формы Windows?

#c# #winforms #printing #printdocument #blurry

#c# #winforms #печать #printdocument #размыто

Вопрос:

Я успешно напечатал форму Windows, но весь текст слегка размыт. Я пришел к выводу, что это результат того, что разрешение экрана намного меньше разрешения, используемого принтером. Есть ли фундаментальный недостаток в моем подходе или есть способ переформатировать текст перед печатью, чтобы он получился четким?

 void PrintImage(object o, PrintPageEventArgs e)
{
    int x = SystemInformation.WorkingArea.X;
    int y = SystemInformation.WorkingArea.Y;
    int width = panel1.Width;
    int height = panel1.Height;

    Rectangle bounds = new Rectangle(x, y, width, height);

    Bitmap img = new Bitmap(width, height);

    this.DrawToBitmap(img, bounds);
    Point p = new Point(100, 100);
    e.Graphics.DrawImage(img, p);
}

private void BtnPrint_Click(object sender, EventArgs e)
{
    btnPrint.Visible = false;
    btnCancel.Visible = false;
    if(txtNotes.Text == "Notes:" || txtNotes.Text == "")
    {
        txtNotes.Visible = false;
    }
    PrintDocument pd = new PrintDocument();
    pd.PrintPage  = new PrintPageEventHandler(PrintImage);
    pd.Print();
}
  

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

1. Я думаю, вам было бы лучше использовать DrawString вместо DrawImage . Может быть, попробовать тест DrawString и посмотреть, четкий ли текст?

Ответ №1:

Есть ли фундаментальный недостаток в моем подходе […]?

ДА.

  1. Вы берете размер panel1 для вычисления размера изображения. Позже вы разрешаете this рисовать изображение, но this это форма, а не панель.

  2. Что заставляет вас думать, что SystemInformation.WorkingArea это связано с окном, которое вы хотите распечатать?

  3. Вам следует немного больше заботиться о одноразовых объектах.

[…] есть ли способ переформатировать текст перед печатью, чтобы он получился четким?

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

Однако вместо размытого текста вы можете получить четкий пиксельный текст, увеличив растровое изображение на определенный коэффициент с помощью NearestNeighbor механизма.

Вот разница в PDF, созданном без масштабирования (слева), и в 3 раза больше (справа) при том же уровне масштабирования в Acrobat Reader (нажмите, чтобы увеличить):

Изображение в результате.

Вот код масштабирования, также без устранения каких-либо проблем:

         this.DrawToBitmap(img, bounds);
        Point p = new Point(100, 100);
        img = ResizeBitmap(img, 3);
        e.Graphics.DrawImage(img, p);
    }

    private static Bitmap ResizeBitmap(Bitmap source, int factor)
    {
        Bitmap result = new Bitmap(source.Width*factor, source.Height*factor);
        result.SetResolution(source.HorizontalResolution*factor, source.VerticalResolution*factor);
        using (Graphics g = Graphics.FromImage(result))
        {
            g.InterpolationMode = InterpolationMode.NearestNeighbor;
            g.DrawImage(source, 0, 0, source.Width*factor, source.Height*factor);
        }
        return resu<
    }
  

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

1. Отметил это правильно, поскольку это мне очень помогло и отвечает на вопрос. Хотя @BlorgBeard был прав, все это нужно делать с помощью drawstring. Спасибо вам обоим, огромная помощь.

2. @SomeNerdAtWork: string в вашем коде вообще нет, что заставило меня подумать, что у вас нет string

3. Код в моем первоначальном сообщении был полностью переработан, спасибо за ввод.