2012-09-22 54 views
1

我对编写代码很陌生,但我正在学习C#,并且正在为我的商店制作一个小小的帐单制作程序。我需要打印表格,这是我的账单。从互联网上搜索,我发现这段代码:以高品质打印winform?

printForm1.Print(this, PrintForm.PrintOption.ClientAreaOnly); 

我的帐单的形式有两种图像和一个gridviewbox。此代码可以打印帐单,但.xps文件的质量很差 - 即使文本不打印得很清晰。

如何提高表格的打印质量?

+0

搜索有关PRINTSCREEN,并用它和表单的位置/大小,以创建形式的高质量图像,然后在打印机发送。所有步骤都将通过代码完成。 – Hamid

+0

[此链接](http://www.c-sharpcorner.com/UploadFile/srajlaxmi/PrintingWindowsForm01182008021239AM/PrintingWindowsForm.aspx)可能有所帮助;除了您发布的一行外,我不确定您尝试过的所有内容。 –

回答

4

是的,除非你有很长的手臂,否则看起来不好。问题在于打印机的像素分辨率要比监视器高得多。一个体面的打印机具有600 dpi(每英寸点数)分辨率。监视器默认情况下为96dpi,虽然这种情况在数十年后停滞不前。

因此,要按照您的方式打印表格,您有两个不愉快的选择。您可以打印表格,使屏幕上的一个像素成为纸上的一个像素。这给你一个原始形式非常清晰的图像,但它是关于邮票的大小。或者,您将纸张上的表格与屏幕上显示的一样大,您现在看到的情况。将显示器上的单个像素变成纸上的6 x 6斑点。结果看起来非常有颗粒感,特别是文字看起来很差。

一个解决方案是在屏幕上画出6倍大的表格并打印出来。然而,这是行不通的,你不能让表格比屏幕更大。唯一真正的解决方案是将6倍大的打印机打印出来。这需要PrintDocument类。并在其PrintPage事件处理程序中执行绘图的一堆代码。你无法哄骗控制手段来为你做,所以这是一大堆工作。

或使用报告生成器。他们存在解决这个问题。谷歌“.net报告生成器”开始购物。

+0

感谢您的帮助。 – Eplzong

0

以下是一个大的图像渲染到打印机的基本样本:

Bitmap bitmapToPrint; 
    public void printImage() 
    { 
     bitmapToPrint = new Bitmap(3400,4400); 
     Font font = new Font(FontFamily.GenericSansSerif, 120, FontStyle.Regular); 
     string alphabet = "abcdefghijklmnopqrstuvwxyz"; 
     Graphics graphics = Graphics.FromImage(bitmapToPrint); 
     graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
     graphics.DrawString(alphabet, font, System.Drawing.Brushes.Black, 0, 0); 
     graphics.DrawString(alphabet, font, System.Drawing.Brushes.Black, 0, 1000); 
     graphics.DrawString(alphabet, font, System.Drawing.Brushes.Black, 0, 2000); 
     graphics.DrawString(alphabet, font, System.Drawing.Brushes.Black, 0, 3000); 

     PrintDocument pd = new PrintDocument(); 
     pd.PrinterSettings.PrinterName = "Microsoft XPS Document Writer"; 
     pd.PrinterSettings.PrintToFile = true; 
     pd.PrintPage += new PrintPageEventHandler(pd_PrintPage); 
     pd.Print(); 
    } 
    void pd_PrintPage(object sender, PrintPageEventArgs e) 
    { 
     e.Graphics.DrawImage(bitmapToPrint, new RectangleF(0.0f, 0.0f, 850.0f, 1100.0f)); 
    }