【问题标题】:How do I print clear text from a windows form?如何从 Windows 窗体打印明文?
【发布时间】:2019-04-18 16:46:17
【问题描述】:

我已经成功打印了一个 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();
}

【问题讨论】:

  • 我认为你最好使用DrawString 而不是DrawImage。或许可以试试DrawString 看看文字是否清晰?

标签: c# winforms printing printdocument blurry


【解决方案1】:

我的方法是否存在根本缺陷 [...] ?

是的。

  1. 你取panel1的大小来计算图片的大小。后来,你让this 绘制到图像上,但是this 是窗体,而不是面板。

  2. 是什么让您认为SystemInformation.WorkingArea与您要打印的窗口有关?

  3. 您应该多注意一次性物品。

[...] 有没有办法在打印之前重新格式化文本以使其清晰?

没有一种通用方法可以让您同时扩展所有其他控件。

但是,您可以通过使用NearestNeighbor 机制将位图放大一定比例来获得清晰的像素化文本,而不是模糊文本。

以下是在 Acrobat Reader 中以相同缩放级别生成的未缩放(左)和 3 倍缩放(右)的 PDF 的区别(点击放大):

这是缩放代码,也没有解决任何一次性问题:

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

【讨论】:

  • 将此标记为正确,因为它确实对我有很大帮助,并且确实回答了这个问题。 @BlorgBeard 说对了,这一切都需要用拉绳来完成。感谢你们两个,巨大的帮助。
  • @SomeNerdAtWork:你的代码中根本没有string,这让我觉得你没有string
  • 我最初帖子中的代码已完全重新编写,不过感谢您的输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多