且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Csharp: print Card using HiTi CS310

更新时间:2022-08-14 15:55:02

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

        }
    }
}