1. 程式人生 > 其它 >C# 生成 聯絡人 二維碼

C# 生成 聯絡人 二維碼

技術標籤:c#vcard

  1. NuGet 引用庫

新增二維碼庫

  1. 不廢話貼程式碼:

using Gma.QrCodeNet.Encoding;
using Gma.QrCodeNet.Encoding.Windows.Render;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test
{
    /// <summary>
    /// 通訊錄元素物件
    /// </summary>
    public class VCard
    {
        /// <summary>
        /// 電話型別
        /// </summary>
        public enum TelType
        {
            /// <summary>
            /// 手機
            /// </summary>
            CELL,
            /// <summary>
            /// 家庭
            /// </summary>
            HOME,
            /// <summary>
            /// 工作
            /// </summary>
            WORK,
            /// <summary>
            /// 視訊
            /// </summary>
            VIDEO,
            /// <summary>
            /// 預設
            /// </summary>
            VOICE
        }
        /// <summary>
        /// 聯絡人電話號碼
        /// </summary>
        public class VCardTel
        {
            /// <summary>
            /// 電話號歸類
            /// </summary>
            public static Dictionary<string, string> VCardTelType { get; private set; }
            /// <summary>
            /// 電話號歸類名稱
            /// </summary>
            public string TelTypeCaptin { get; set; }
            /// <summary>
            /// 電話號歸類
            /// </summary>
            public string TelType { get; set; }
            /// <summary>
            /// 電話號
            /// </summary>
            public string Tel { get; set; }

            /// <summary>
            /// 聯絡電話號碼
            /// </summary>
            static VCardTel()
            {
                VCardTelType = new Dictionary<string, string>()
                {
                    {"CELL","手機" },
                    {"HOME","家庭" },
                    {"WORK","工作" },
                    {"VIDEO","視訊" },
                    {"VOICE","預設" },
                };
            }

            /// <summary>
            /// 建立一個預設聯絡電話
            /// </summary>
            public VCardTel()
            {
                TelTypeCaptin = "工作";
                TelType = "WORK";
            }
            /// <summary>
            /// 建立聯絡電話
            /// </summary>
            /// <param name="tel"></param>
            /// <param name="type"></param>
            public VCardTel(string tel, string type)
            {
                if (VCardTelType.ContainsKey(type))
                {
                    this.TelType = type;
                    this.TelTypeCaptin = VCardTelType[type];
                }
                this.Tel = tel;
            }
            /// <summary>
            /// 建立聯絡電話
            /// </summary>
            /// <param name="tel"></param>
            /// <param name="type"></param>
            public VCardTel(string tel, TelType type = VCard.TelType.WORK) : this(tel, type.ToString()) { }
        }

        /// <summary>
        /// 聯絡人姓名
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 聯絡人電話號碼
        /// </summary>
        public List<VCardTel> Tels { get; set; }
        /// <summary>
        /// 聯絡人地址
        /// </summary>
        public string Addr { get; set; }
        /// <summary>
        /// 聯絡人郵件
        /// </summary>
        public string Email { get; set; }
        /// <summary>
        /// 聯絡人單位
        /// </summary>
        public string Org { get; set; }

        /// <summary>
        /// 建立一個聯絡人
        /// </summary>
        public VCard()
        {
            this.Tels = new List<VCardTel>();
        }
        /// <summary>
        /// 建立一個聯絡並初始化資料
        /// </summary>
        /// <param name="name"></param>
        /// <param name="tel"></param>
        public VCard(string name, string tel) : this()
        {
            this.Name = name;
            this.Tels.Add(new VCardTel(tel, TelType.WORK));
        }
        /// <summary>
        /// 新增一個電話
        /// </summary>
        /// <param name="tel"></param>
        /// <param name="type"></param>
        public void AddTel(string tel, TelType type = TelType.WORK)
        {
            if (this.Tels.Where(i => i.Tel == tel).Count() == 0)
                this.Tels.Add(new VCardTel(tel, type));
        }
        /// <summary>
        /// 講一個json序列化的聯絡人轉聯絡人物件
        /// </summary>
        /// <param name="json"></param>
        /// <param name="card"></param>
        /// <returns></returns>
        public bool TryParse(string json, out VCard card)
        {
            card = null;
            var reuslt = false;
            try
            {
                if (string.IsNullOrWhiteSpace(json) == false)
                {
                    card = Newtonsoft.Json.JsonConvert.DeserializeObject<VCard>(json);
                    reuslt = true;
                }
            }
            catch (Exception exc)
            {
#if DEBUG
                Console.WriteLine(exc);
#endif
            }
            return reuslt;
        }
        /// <summary>
        /// 獲取聯絡人字串
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            if (string.IsNullOrWhiteSpace(Name) || Tels.Count == 0)
                return "please input Name and Tels value";
            var result = new StringBuilder();
            result.AppendLine("BEGIN:VCARD VERSION:3.0");
            result.AppendLine($"N:;{Name};;;");
            result.AppendLine($"FN:{Name}");
            result.AppendLine(string.Join("\r\n", Tels.Select(i => $"TEL;TYPE={i.TelType}:{i.Tel}")));
            if (!string.IsNullOrWhiteSpace(Email))
                result.AppendLine($"EMAIL;TYPE=internet:{Email}");
            if (!string.IsNullOrWhiteSpace(Addr))
                result.AppendLine($"ADR;TYPE=WORK;CHARSET=UTF-8:;;{Addr};;;;");
            if (!string.IsNullOrWhiteSpace(Org))
                result.AppendLine($"ORG;CHARSET=UTF-8:{Org}");
            result.AppendLine("END:VCARD");
            return result.ToString();
        }
        /// <summary>
        /// 序列號物件 預設json格式化
        /// </summary>
        /// <param name="format">j:轉json格式; v:轉vcard格式</param>
        /// <returns>格式化後字串</returns>
        public string ToString(string format)
        {
            string result;
            if (format?.ToLower() == "v")
                result = this.ToString();
            else
                result = Newtonsoft.Json.JsonConvert.SerializeObject(this);
            return result;
        }
        /// <summary>
        /// 生成二維碼
        /// </summary>
        /// <param name="directory"></param>
        /// <returns></returns>
        public string SaveGma(DirectoryInfo directory)
        {
            string filePath = Path.Combine(directory.FullName, $"{Name}{DateTime.Now:yyyyMMddHHmmss}.png");
            string vcard = ToString();
            var encoder = new QrEncoder(ErrorCorrectionLevel.M);
            if (encoder.TryEncode(vcard, out QrCode qrCode))
            {
                var gRenderer = new GraphicsRenderer(
                new FixedModuleSize(2, QuietZoneModules.Two),
                Brushes.Black,
                Brushes.White);
                using (FileStream file = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                {
                    gRenderer.WriteToStream(qrCode.Matrix, ImageFormat.Png, file);
                }
            }
            else
                return null;
            return filePath;
        }
    }
}



  1. 呼叫測試程式碼:

			VCard card = new VCard("一個菜鳥", "110");
            card.Addr = "四川省成都市武侯";
            card.Org = "恭喜發財";
            card.Email = "[email protected]";
            card.AddTel("110", VCard.TelType.HOME);
            var gmaFilePath= card.SaveGma(new System.IO.DirectoryInfo(@"C:\Users\logxo\source\repos\getLonbon\bin\Debug"));

開啟二維碼,掃描一下測試結果

生成的二維碼