public Bitmap CreateFrontCard(DrivingLicense obj)
        {
            byte[] photo = null;
            if (!String.IsNullOrEmpty(obj.Holder.PhotoData))
            {
                var photoData = Convert.FromBase64String(obj.Holder.PhotoData);
                photo = photoData;
            }

            byte[] sign = null;
            if (!String.IsNullOrEmpty(obj.Holder.SignatureData))
            {
                var signData = Convert.FromBase64String(obj.Holder.SignatureData);
                sign = signData;
            }

            // 85.60 x 54.00 mm or 2.127 in x 3.37 in
            var canvasWidthInPixel  = (int)Math.Round(GraphicsHelper.Dpi * GraphicsHelper.CanvasWidth);
            var canvasHeightInPixel = (int)Math.Round(GraphicsHelper.Dpi * GraphicsHelper.CanvasHeight);
            var cardBitmap          = new Bitmap(canvasWidthInPixel, canvasHeightInPixel, PixelFormat.Format32bppArgb);

            cardBitmap.SetResolution(GraphicsHelper.Dpi, GraphicsHelper.Dpi);

            //var background = FrontSideBackground;
            using (var gr = Graphics.FromImage(cardBitmap))
            {
                gr.SmoothingMode      = SmoothingMode.HighQuality;
                gr.InterpolationMode  = InterpolationMode.HighQualityBicubic;
                gr.PixelOffsetMode    = PixelOffsetMode.HighQuality;
                gr.TextRenderingHint  = TextRenderingHint.ClearTypeGridFit;
                gr.PageUnit           = GraphicsUnit.Pixel;
                gr.CompositingQuality = CompositingQuality.HighQuality;
                gr.Clear(Color.Transparent);
                //gr.DrawImage(background, 0, 0, canvasWidthInPixel, canvasHeightInPixel);

                FillFrontSideTextByDrawText(gr, obj);
                //FillFrontSideTextByTextRenderer(gr);

                GraphicsHelper.DrawPhoto(gr, photo, 43, 166);
                GraphicsHelper.DrawSign(gr, sign, 70, 485);
            }

            return(cardBitmap);
        }
        void FillFrontSideTextByDrawText(Graphics gr, DrivingLicense obj)
        {
            var textMargin = GraphicsHelper.DefaultMainTextMargin + 35;

            GraphicsHelper.DrawMainText(gr, "1.", 160);
            GraphicsHelper.DrawText(gr, obj.Holder.LastName.ToUpper(), textMargin, 160);
            GraphicsHelper.DrawMainText(gr, "2.", 194);
            GraphicsHelper.DrawText(gr, obj.Holder.FirstName.ToUpper(), textMargin, 194);
            GraphicsHelper.DrawText(gr, obj.Holder.MiddleName.ToUpper(), textMargin, 228);
            GraphicsHelper.DrawMainText(gr, "3.", 262);

            var placeOfBirth = obj.Holder.PlaceOfBirth;
            var placeAndDate = String.Format("{0}   {1}", placeOfBirth, obj.Holder.DateOfBirth.ToShortDateString());

            GraphicsHelper.DrawText(gr, placeAndDate.ToUpper(), textMargin, 262);
            GraphicsHelper.DrawMainText(gr, "4c.", 330);
            var placeOfIssue = obj.PlaceOfIssue;

            GraphicsHelper.DrawText(gr, placeOfIssue.ToUpper(), textMargin, 330);
            GraphicsHelper.DrawMainText(gr, "4d.", 364);
            GraphicsHelper.DrawText(gr, obj.Holder.PersonalNumber, textMargin, 364);
            GraphicsHelper.DrawMainText(gr, "5.", 398);
            GraphicsHelper.DrawText(gr, obj.CardNumber.ToUpper(), textMargin, 398);

            GraphicsHelper.DrawText(gr, "4a.", GraphicsHelper.DefaultMainTextMargin, 296, 200);
            GraphicsHelper.DrawText(gr, obj.DateOfIssue.ToShortDateString(), textMargin, 296, 200);
            GraphicsHelper.DrawText(gr, "4b.", 554, 296, 245);
            GraphicsHelper.DrawText(gr, obj.DateOfExpiry.ToShortDateString(), 590, 296, 245);
            GraphicsHelper.DrawText(gr, "8.", GraphicsHelper.DefaultMainTextMargin, 432, GraphicsHelper.DefaultTextBlockWidth, 85);

            var placeOfResidence = obj.Holder.PlaceOfResidence.ToString();

            GraphicsHelper.DrawText(gr, placeOfResidence.ToUpper(), 344, 432, 425, 85);
            GraphicsHelper.DrawText(gr, "6.", 38, 459, GraphicsHelper.DefaultTextBlockWidth, 85);
            GraphicsHelper.DrawText(gr, "7.", 38, 524, GraphicsHelper.DefaultTextBlockWidth, 85);

            GraphicsHelper.DrawMainText(gr, "9.", 534);
            if (obj.CategoryList.Length != 0)
            {
                var category = obj.CategoryList.Select(se => se.Name).ToString(" \\ ");
                GraphicsHelper.DrawText(gr, category, textMargin, 534);
            }
        }
        public Bitmap CreateBackCard(DrivingLicense obj)
        {
            var canvasWidthInPixel  = (int)Math.Round(GraphicsHelper.Dpi * GraphicsHelper.CanvasWidth);
            var canvasHeightInPixel = (int)Math.Round(GraphicsHelper.Dpi * GraphicsHelper.CanvasHeight);
            var cardBitmap          = new Bitmap(canvasWidthInPixel, canvasHeightInPixel, PixelFormat.Format32bppArgb);

            cardBitmap.SetResolution(GraphicsHelper.Dpi, GraphicsHelper.Dpi);

            //var background = BackSideBackground;
            using (var gr = Graphics.FromImage(cardBitmap))
            {
                gr.SmoothingMode      = SmoothingMode.HighQuality;
                gr.InterpolationMode  = InterpolationMode.HighQualityBicubic;
                gr.PixelOffsetMode    = PixelOffsetMode.HighQuality;
                gr.TextRenderingHint  = TextRenderingHint.ClearTypeGridFit;
                gr.PageUnit           = GraphicsUnit.Pixel;
                gr.CompositingQuality = CompositingQuality.HighQuality;

                gr.Clear(Color.Transparent);
                //gr.DrawImage(background, 0, 0, canvasWidthInPixel, canvasHeightInPixel);

                const int textMarginX = 593;
                const int diffMarginX = 55;
                foreach (var c in obj.CategoryList)
                {
                    var textMarginY = 116;
                    switch (c.Name)
                    {
                    case "B":
                        textMarginY = textMarginY + diffMarginX;
                        break;

                    case "C":
                        textMarginY = textMarginY + diffMarginX * 2;
                        break;

                    case "D":
                        textMarginY = textMarginY + diffMarginX * 3 + 5;
                        break;

                    case "BE":
                        textMarginY = textMarginY + diffMarginX * 4 + 5;
                        break;

                    case "CE":
                        textMarginY = textMarginY + diffMarginX * 5 + 5;
                        break;

                    case "DE":
                        textMarginY = textMarginY + diffMarginX * 6 + 5;
                        break;
                    }

                    if (c.DateOfIssue.HasValue && c.DateOfIssue.Value != DateTime.MinValue)
                    {
                        GraphicsHelper.DrawText(gr, c.DateOfIssue.Value.ToShortDateString(), textMarginX, textMarginY, 115, 50);
                    }
                    if (c.DateOfExpiry.HasValue && c.DateOfExpiry.Value != DateTime.MinValue)
                    {
                        GraphicsHelper.DrawText(gr, c.DateOfExpiry.Value.ToShortDateString(), textMarginX + 120, textMarginY, 115, 50);
                    }
                }
            }

            return(cardBitmap);
        }