Как распечатать чистый текст из формы Windows? - PullRequest
2 голосов
/ 18 апреля 2019

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

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 Ответ

1 голос
/ 18 апреля 2019

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

Да.

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

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

  3. Вы должны позаботиться об одноразовых предметах.

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

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

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

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

Image in result.

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

        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 result;
    }
...