using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Drawing.Imaging; using System.Drawing.Printing; using System.Drawing.Drawing2D; using System.Drawing.Text; using System.Diagnostics; using System.Runtime.InteropServices; namespace FeaTon.WaterImage { /// <summary> /// 員工IC卡打印 /// 塗聚文 20121225 /// /// </summary> public partial class IdCardForm : Form { /// <summary> /// 卡底圖 /// </summary> string path = string.Empty; /// <summary> /// 卡相片 /// </summary> string Photopath = string.Empty; /// <summary> /// 設置字體 /// </summary> string setFont = "宋体"; [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]//应用API函数 private static extern bool BitBlt( IntPtr hdcDest, // 目标设备的句柄 int nXDest, // 目标对象的左上角的X坐标 int nYDest, // 目标对象的左上角的X坐标 int nWidth, // 目标对象的矩形的宽度 int nHeight, // 目标对象的矩形的长度 IntPtr hdcSrc, // 源设备的句柄 int nXSrc, // 源对象的左上角的X坐标 int nYSrc, // 源对象的左上角的X坐标 System.Int32 dwRop // 光栅的操作值 ); /// <summary> /// /// </summary> public IdCardForm() { InitializeComponent(); } /// <summary> /// 查找安裝的打印機 /// </summary> private void PopulateInstalledPrintersCombo() { System.Data.DataTable PrintersList = new System.Data.DataTable(); PrintersList.Columns.Add("id", typeof(int)); PrintersList.Columns.Add("InstalledPrinters", typeof(string)); // Add list of installed printers found to the combo box. // The pkInstalledPrinters string will be used to provide the display string. String pkInstalledPrinters; for (int i = 0; i < PrinterSettings.InstalledPrinters.Count; i++) { pkInstalledPrinters = PrinterSettings.InstalledPrinters[i]; //comboInstalledPrinters.Items.Add(pkInstalledPrinters); PrintersList.Rows.Add(i, pkInstalledPrinters); } comboInstalledPrinters.DataSource = PrintersList; comboInstalledPrinters.DisplayMember = "InstalledPrinters"; comboInstalledPrinters.ValueMember = "id"; comboInstalledPrinters.AutoCompleteMode = AutoCompleteMode.Suggest; comboInstalledPrinters.AutoCompleteSource = AutoCompleteSource.ListItems; } /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void IdCardForm_Load(object sender, EventArgs e) { //尋找本地安裝打印機 PopulateInstalledPrintersCombo(); // //尋找本地安裝字體 InstalledFontCollection fontCollection = new InstalledFontCollection(); foreach (FontFamily fontFamily in fontCollection.Families) { this.comboBoxFont.Items.Add(fontFamily.Name); } this.comboBoxFont.SelectedIndex = 10; //Response.Redirect(newPath); } /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void comboInstalledPrinters_SelectedIndexChanged(object sender, EventArgs e) { if (comboInstalledPrinters.SelectedIndex != -1) { // The combo box's Text property returns the selected item's text, which is the printer name. printDocument1.PrinterSettings.PrinterName = comboInstalledPrinters.Text; } } /// <summary> /// Define DrawImageAbort callback method. /// </summary> /// <param name="callBackData"></param> /// <returns></returns> private bool DrawImageCallback4(IntPtr callBackData) { // Test for call that passes callBackData parameter. if (callBackData == IntPtr.Zero) { // If no callBackData passed, abort DrawImage method. return true; } else { // If callBackData passed, continue DrawImage method. return false; } } /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { // Create callback method. Graphics.DrawImageAbort imageCallback = new Graphics.DrawImageAbort(DrawImageCallback4); IntPtr imageCallbackData = new IntPtr(1); pictureBox1.Width = Width; pictureBox1.Height = Height; System.Drawing.Image image = this.pictureBox1.Image; int x = Convert.ToInt32(e.MarginBounds.X - e.PageSettings.HardMarginX); x = Screen.PrimaryScreen.Bounds.Width; int y = Convert.ToInt32(e.MarginBounds.Y - e.PageSettings.HardMarginY); y = Screen.PrimaryScreen.Bounds.Height; System.Drawing.Rectangle destRect = new System.Drawing.Rectangle(0, 0, Width, Height); System.Drawing.Image image1 = resizeImage(image,new Size(Width, Height)); // Create image attributes and set large gamma. ImageAttributes imageAttr = new ImageAttributes(); imageAttr.SetGamma(4.0F); GraphicsUnit units = GraphicsUnit.Pixel; e.Graphics.DrawImage(image1, destRect, 0, 0, image1.Width, image1.Height, units);//, imageAttr, imageCallback, imageCallbackData //e.HasMorePages = false; //IntPtr dc1 = e.Graphics.GetHdc(); //IntPtr dc2 = e.Graphics.GetHdc(); // BitBlt(dc2, 0, 0, panel4.ClientRectangle.Width, panel4.ClientRectangle.Height,dc1, 0, 0, 13369376); //BitBlt(dc1, 0, 0, image1.Width, 1024, dc1, 0, 0, 13369376); } /// <summary> /// 因為沒有引用HiTi打卡打印機的SDK,無法打印 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonPrint_Click(object sender, EventArgs e) { PaperSize pkCustomSize = new PaperSize("Custum", 775, 453); //員工IC卡格式 this.printDocument1.DefaultPageSettings.PaperSize = pkCustomSize; //printPreviewDialog1.SetBounds(0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); pageSetupDialog1.PageSettings.Landscape = false; //true縱向 //false橫向 int width = 775; //216*97 int height = 453;//(int)(101 * 100 / 25.4 + 1); foreach (PaperSize paperSize in printDocument1.PrinterSettings.PaperSizes) { if (paperSize.Height == width && paperSize.Height == height)//paperSize.PaperName == "Custum" && { printDocument1.DefaultPageSettings.PaperSize = paperSize; break; } } if(printPreviewDialog1.ShowDialog()== DialogResult.Yes) { //System.Drawing.Printing.Duplex System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument(); pd.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(printDocument1_PrintPage); pd.Print(); //printDocument1.Print(); } } /// <summary> /// /// </summary> /// <param name="imgToResize"></param> /// <param name="size"></param> /// <returns></returns> private static Image resizeImage(Image imgToResize, Size size) { int sourceWidth = imgToResize.Width; int sourceHeight = imgToResize.Height; float nPercent = 0; float nPercentW = 0; float nPercentH = 0; nPercentW = ((float)size.Width / (float)sourceWidth); nPercentH = ((float)size.Height / (float)sourceHeight); if (nPercentH < nPercentW) nPercent = nPercentH; else nPercent = nPercentW; int destWidth = (int)(sourceWidth * nPercent); int destHeight = (int)(sourceHeight * nPercent); Bitmap b = new Bitmap(destWidth, destHeight); Graphics g = Graphics.FromImage((Image)b); g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); g.Dispose(); return (Image)b; } /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void comboBoxFont_SelectedIndexChanged(object sender, EventArgs e) { setFont = this.comboBoxFont.Text; } /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonImage_Click(object sender, EventArgs e) { DirectoryInfo dirInfo = new DirectoryInfo(Application.StartupPath + "\\temp\\"); //加文字水印,注意,这里的代码和以下加图片水印的代码不能共存 path = dirInfo + "id4.jpg"; string newpath = dirInfo + "id4001.jpg"; System.Drawing.Image image = System.Drawing.Image.FromFile(path); Graphics g = Graphics.FromImage(image); g.DrawImage(image, 0, 0, image.Width, image.Height); Font f = new Font(setFont, 18, FontStyle.Bold); //字體大小 Font fno = new Font(setFont, 10, FontStyle.Bold); Font fclerk = new Font(setFont, 8, FontStyle.Bold); Brush b = new SolidBrush(Color.Black); //字體顏色 string addText = "塗聚文"; //new RectangleF(0, 0, 500, 500), strFormat) g.DrawString(addText, f, b, new RectangleF(130, 220, 550, 110), new StringFormat());//放的姓名位置 g.DrawString("行政及人事管理人員", fclerk, b, new RectangleF(130, 410, 550, 110), new StringFormat());//放職稱的位置 g.DrawString("行政及人力资源管理部", fno, b, new RectangleF(130, 470, 550, 110), new StringFormat());//放部門名稱的位置 g.DrawString("L00094", fno, b, new RectangleF(130, 540, 550, 110), new StringFormat()); //放員工編號的位置 image.Save(newpath); g.Dispose(); image.Dispose(); //加图片水印 System.Drawing.Image image = System.Drawing.Image.FromFile(newpath); int xPosOfWm; int yPosOfWm; int phWidth = image.Width; int phHeight = image.Height; Photopath = dirInfo + "2cun.jpg"; //2寸照片 System.Drawing.Image copyImage = System.Drawing.Image.FromFile(Photopath); int wmWidth = copyImage.Width; int wmHeight = copyImage.Height; Graphics g1 = Graphics.FromImage(image); xPosOfWm = phWidth - wmWidth - 80; yPosOfWm = 80; StringFormat strFormat = new StringFormat(); g1.DrawImage(copyImage, new Rectangle(xPosOfWm, yPosOfWm, wmWidth, wmHeight), 0, 0, copyImage.Width, copyImage.Height, GraphicsUnit.Pixel); g1.Dispose(); //保存加水印过后的图片,删除原始图片 string newPath = string.Empty; //Server.MapPath(".") + "/UploadFile/" + fileName + "_new" + extension; newPath = dirInfo + DateTime.Now.Ticks.ToString() + "_1011.jpg"; image.Save(newPath); pictureBox1.Image = Image.FromFile(newPath); this.textBox1.Text = newPath; image.Dispose(); if (File.Exists(newpath)) { File.Delete(newpath); } } /// <summary> /// 調用Windows圖片和傳真查看器 /// HiTiCS3xx 卡片打印機,沒有調用其SDK只能這種方打印了。 /// 塗聚文 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { //Process.Start("rundll32.exe", @"C:\Windows\System32\shimgvw.dll,ImageView_PrintTo /pt C:\0JQJ\Rose.tif"); //Process.Start("rundll32.exe", @"C:\Windows\System32\shimgvw.dll,ImageView_PrintTo /pt C:\0JQJ\Rose.tif ADD-PRINTER17"); //Process.Start("rundll32.exe", @"C:\Windows\System32\shimgvw.dll,ImageView_PrintTo /pt C:\0JQJ\Rose.tif ADDFILE00\ADD-PRINTER17"); string Path = textBox1.Text; ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "rundll32.exe"; startInfo.Arguments = @"D:\WINDOWS\System32\shimgvw.dll,ImageView_Fullscreen" + " " + Path; Process.Start(startInfo); } /// <summary> /// 員工卡圖片生成 /// 由背景圖,貼上二寸照片,再加上個人信息而成 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { DirectoryInfo dirInfo = new DirectoryInfo(Application.StartupPath + "\\temp\\"); //加文字水印,注意,这里的代码和以下加图片水印的代码不能共存 path = dirInfo + "id4.jpg"; //底圖片 System.Drawing.Image image = System.Drawing.Image.FromFile(path); Graphics g = Graphics.FromImage(image); g.DrawImage(image, 0, 0, image.Width, image.Height); Font f = new Font(setFont, 18, FontStyle.Bold); //字體大小 Font fno = new Font(setFont, 10, FontStyle.Bold); Font fclerk = new Font(setFont, 8, FontStyle.Bold); Brush b = new SolidBrush(Color.Black); //字體顏色 string addText = "塗聚文"; //new RectangleF(0, 0, 500, 500), strFormat) g.DrawString(addText, f, b, new RectangleF(130, 220, 550, 110), new StringFormat());//放的姓名位置 g.DrawString("行政及人事管理人員", fclerk, b, new RectangleF(130, 410, 550, 110), new StringFormat());//放職稱的位置 g.DrawString("行政及人力资源管理部", fno, b, new RectangleF(130, 470, 550, 110), new StringFormat());//放部門名稱的位置 g.DrawString("L00094", fno, b, new RectangleF(130, 540, 550, 110), new StringFormat()); //放員工編號的位置 int xPosOfWm; int yPosOfWm; int phWidth = image.Width; int phHeight = image.Height; Photopath = dirInfo + "2cun.jpg"; //2寸照片 System.Drawing.Image copyImage = System.Drawing.Image.FromFile(Photopath); int wmWidth = copyImage.Width; int wmHeight = copyImage.Height; xPosOfWm = phWidth - wmWidth - 80; yPosOfWm = 80; StringFormat strFormat = new StringFormat(); g.DrawImage(copyImage, new Rectangle(xPosOfWm, yPosOfWm, wmWidth, wmHeight), 0, 0, copyImage.Width, copyImage.Height, GraphicsUnit.Pixel); //保存加水印过后的图片,删除原始图片 string newPath = string.Empty; //Server.MapPath(".") + "/UploadFile/" + fileName + "_new" + extension; newPath = dirInfo + DateTime.Now.Ticks.ToString() + "_1011.jpg"; image.Save(newPath); pictureBox1.Image = Image.FromFile(newPath); this.textBox1.Text = newPath; g.Dispose(); image.Dispose(); //if (File.Exists(newPath)) //{ // File.Delete(newPath); //} } } }