一,我的打印方案
我是使用的PrintDocument 這個控件來打印的,粘貼一下我的代碼
private void btn_raw_Click(object sender, EventArgs e) { PrintDocument printDoc = new PrintDocument(); //自定義紙張類型 printDoc.DefaultPageSettings.PaperSize = new PaperSize("Custum", 300, 480); printDoc.PrintPage += PrintDoc_PrintPage; //打印的時候不要跳出窗口 printDoc.PrintController = new StandardPrintController(); printDoc.DefaultPageSettings.Landscape = false; //false 表示縱向 //打印預覽 PrintPreviewDialog ppd = new PrintPreviewDialog(); ppd.Document = printDoc; try {//顯示打印預覽窗口 ppd.WindowState = FormWindowState.Maximized; ppd.ShowDialog(); } catch (Exception excep) { //顯示打印出錯消息 MessageBox.Show(excep.Message, "打印出錯", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
打印事件
private void PrintDoc_PrintPage(object sender, PrintPageEventArgs e) { //獲取打印機的DPI int widthDPI = (int)e.Graphics.DpiX; int heightDPI = (int)e.Graphics.DpiY; // 1.設置條形碼規格 EncodingOptions encodeOption = new EncodingOptions(); //這樣是將百分之一英寸轉換為像素 //例如200實際表示的是2英寸, 60表示的是0.6英寸 int bmpwidth = 200; int bmpheight = 60; //將上面的英寸轉換為圖片需要的像素. 比如DPI為600 ,那么一英寸就需要600個像素, //所以計算公式為(百分之一英寸/100)*DPI=實際像素 encodeOption.Height = bmpheight *heightDPI / 100; encodeOption.Width = bmpwidth *widthDPI / 100; // 2.生成條形碼圖片並保存 ZXing.BarcodeWriter wr = new BarcodeWriter(); wr.Options = encodeOption; wr.Format = BarcodeFormat.CODE_128; // 這里可以設定條碼的標准 var img = wr.Write("abcdefghijklmn"); // 生成圖片 //下面這三行是用於提升圖片打印質量的,如果是在是理解不了單位的轉換,可以直接使用這三行代碼, //打印的效果也不差 //e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; //e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //e.Graphics.PixelOffsetMode = PixelOffsetMode.Half; e.Graphics.DrawImage(img, new Rectangle(25, 25, bmpwidth, bmpheight), new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel); //再打印一個二維碼 //這里的尺寸單位是百分之一英寸 bmpwidth = 100; bmpheight = 100; //轉換為實際需要的像素 encodeOption.Height = bmpheight * heightDPI / 100; encodeOption.Width = bmpwidth * widthDPI / 100; wr.Options = encodeOption; wr.Format = BarcodeFormat.DATA_MATRIX; Bitmap img2 = wr.Write("11111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344444444444444444444444444444444444444444444444444444444444444444444444444444444444444555555555555555555555555555555555555555555555555555555555555555555"); e.Graphics.DrawImage(img2, new Rectangle(100, 150, bmpwidth, bmpheight), new Rectangle(0, 0, img2.Width, img2.Height), GraphicsUnit.Pixel); //SizeF size= e.Graphics.MeasureString("Ivan Test", new Font("黑體", 11)); //e.Graphics.DrawString("123 Test", new Font("黑體", 11), System.Drawing.Brushes.Black, 450, 300); }
二,打印圖片為什么會模糊呢?
這是因為單位的錯誤導致的.
圖片的寬度和高度實際的單位是像素, 但是打印時候的寬度和高度確實百分之一英寸為單位.
舉個例子,一個圖片是600px寬 600px 高, 有一台打印機的DPI 高和寬都是600 , 那么用DrawImage打印圖片的時候, 就會把圖片600像素的寬,理解為了600百分之一英寸(6英寸),數值沒變,只是單位的理解不一樣,
於是打印6英寸寬,需要跨度6*600DPI=3600像素, 但是圖片本身只有600像素,於是就把圖片的寬放大到3600像素,同理高也是這樣,需要放大.
放大以后的位圖就會出現鋸齒,如果是一般的打印機還能打印出灰度, 圖片還能看,模糊的不是很明顯,如果是是標簽打印機,只有黑色一種顏色, 那些灰度值就要丟棄,導致打印的標簽非常模糊.
所以如果要打印6英寸的一條線,DPI為600的情況下, 需要准備6*600=3600像素的線條,然后告訴打印機 我要打印的寬度是600(百分之一英寸) , 打印圖像的3600像素, 元素圖像的單位是像素.
具體的語句就是
e.Graphics.DrawImage(img, new Rectangle(25, 25, bmpwidth, bmpheight), new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel);
可以多看看這個方法的描述就懂了.
這個方法已經在zebra打印機上面測試過,效果非常好.
我上面的代碼里面引用了一個創建條碼的庫, 大家可以使用Unget安裝,就不會報錯了.
Install-Package ZXing.Net -Version 0.16.6
可以下載我的測試程序
https://download.csdn.net/download/xiaoxiong3533521/20302893