GroupDocsGists
10/24/2017 - 1:25 PM

SignatureController.cs

// For complete examples and data files, please go to https://github.com/groupdocs-signature/GroupDocs.Signature-for.NET
using System;
using System.IO;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Script.Serialization;
using Groupdocs.Web.UI.Core;
using Groupdocs.Web.UI.DataTransferObjects;
using GroupDocs.Signature.Domain;
using GroupDocs.Signature.Handler;
using Signature.Net.Sample.Mvc.Models;
using Signature.Net.Sample.Mvc.Engine;
using Signature.Net.Sample.Mvc.Infrastructure;

namespace Signature.Net.Sample.Mvc.Controllers
{
    public class SignatureController : Controller
    {
        private const string AppDataVirtualPath = "~/App_Data/";
        private readonly SigningEngine _signingEngine;
        private readonly ICoreHandler _coreHandler;

        public SignatureController(ISigningEngine signingEngine,
                                   ISvgRenderer svgRenderer,
                                   ICoreHandler coreHandler)
        {
            _signingEngine = (SigningEngine)signingEngine;
            _coreHandler = coreHandler;
        }

        [HttpPost]
        public ActionResult PublicGetDocument(string documentGuid, string recipientGuid)
        {
            var result = new
            {
                status = "Ok",
                result = new
                {
                    document = new
                    {
                        guid = documentGuid,
                        name = documentGuid,
                        signedName = documentGuid + "_signed1.pdf",
                        signedFromAll = false,
                        recipient = new
                        {
                            id = 0,
                            guid = "71d1f3ef88a5d7fe32f4c46588a69887",
                            documentGuid,
                            firstName = "",
                            lastName = "",
                            email = "",
                            signed = false
                        }
                    }
                }
            };
            return Json(result);
        }

        [HttpPost]
        public ActionResult PublicGetDocumentFields()
        {
            var result = new
            {
                status = "Ok",
                result = new
                {
                    fields = new[]
                    {
                        new
                        {
                            id = "1c9b463ac3c1e9ebaf51e34ea352de3a",
                            name = "Signature1",
                            fieldType = 1,
                            mandatory = true,
                            data = (object) null,
                            minGraphSizeW = 0,
                            minGraphSizeH = 0,
                            recipientGuid = "71d1f3ef88a5d7fe32f4c46588a69887",
                            locations = new[]
                            {
                                new
                                {
                                    page = 1,
                                    locationHeight = 50.0,
                                    locationWidth = 150.0,
                                    locationX = 0.4,
                                    locationY = 0.3,
                                    fontBold = (object) null,
                                    fontColor = (object) null,
                                    fontItalic = (object) null,
                                    fontName = (object) null,
                                    fontSize = (object) null,
                                    fontUnderline = (object) null,
                                    id = "ff4dd6a4a44ecd682a4be3a19a801e6f",
                                    align = 0
                                }
                            },
                            lockDuringSign = false,
                            acceptableValues = (object) null,
                            tooltip = (object) null,
                            settings = (object) null,
                            groupName = (object) null,
                            guidanceText = (object) null,
                            regularExpression = (object) null,
                            defaultValue = ""
                        }
                    }
                }

            };
            return Json(result);
        }


        [HttpPost]
        public ActionResult ViewDocument(string path,
            int quality, int width)
        {
            string fileNameExtension = Path.GetExtension(path).TrimStart('.');
            fileNameExtension = fileNameExtension.ToLower();
            string appDataPath = Server.MapPath(AppDataVirtualPath);
            DocumentDescription documentDescription = SignatureHandler.GetPageDescriptions(Path.Combine(appDataPath, path));
            int pageCount = documentDescription.Pages.Count;
            string[] pageImageUrls = GetImageUrls(path, 0, pageCount, width, quality);
            UrlHelper urlHelper = new UrlHelper(Request.RequestContext);
            string documentDownloadUrl = urlHelper.Action("GetDocument", "Signature", new { path });
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            string documentDescriptionJs = LowerCaseJsonSerializer.SerializeObject(documentDescription);
            var result = new
            {
                path,
                docType = "Pdf",
                fileType = fileNameExtension,
                url = documentDownloadUrl,
                pdfDownloadUrl = (string)null,
                name = path,
                imageUrls= pageImageUrls,
                lic = true,
                pdfPrintUrl = (string)null,
                pageHtml = (object)null,
                pageCss = (object)null,
                documentDescription = documentDescriptionJs,
                urlForResourcesInHtml = (object)null,
                sharedCss = (object)null,
                success = true
            };
            return Json(result);
        }

        [HttpPost]
        public ActionResult GetImageUrls(string path,
                                         string dimension,
                                         int firstPage,
                                         int pageCount,
                                         int? quality)
        {
            int? width = null;
            if (!String.IsNullOrEmpty(dimension))
                width = Int32.Parse(dimension.Substring(0, dimension.Length - 1));
            string[] pageImageUrls = GetImageUrls(path, 0, pageCount, width, quality);
            var result = new {imageUrls = pageImageUrls, success = true };
            return Json(result);
        }


        public ActionResult GetSignatureBackgroundSvg()
        {
            return File(Server.MapPath("~/gd-signature/signature2/resource/signature.svg"), "image/svg+xml");
        }

        public ActionResult GetStampBackgroundSvg()
        {
            return File(Server.MapPath("~/gd-signature/signature2/resource/stamp.png"), "image/png");
        }

        public ActionResult GetDocumentPageImage(string path, int? width, int? quality, int pageIndex)
        {
            string appDataPath = Server.MapPath(AppDataVirtualPath);
            byte[] fileBytes = SignatureHandler.GetDocumentPageImage(Path.Combine(appDataPath, path), width, quality, pageIndex);
            if (fileBytes == null)
                return new EmptyResult();
            else
                return File(fileBytes, "image/jpeg");
        }

        public ActionResult PublicSignDocument(string documentGuid,
            string documentId,
            string name,
            SignatureField[] fields)
        {
            if (fields == null || fields.Length == 0)
                return new EmptyResult();
            string appDataPath = Server.MapPath(AppDataVirtualPath);

            UrlHelper urlHelper = new UrlHelper(Request.RequestContext);
            Func<string, string> urlCreator = (filePath) => urlHelper.Action("GetDocument", "Signature", new { path = filePath});
            object resultData = _signingEngine.SignDocument(appDataPath, documentGuid, 
                documentId, name, fields, urlCreator);

            return Json(resultData);
        }


        public ActionResult GetDocument(string path)
        {
            string appDataPath = Server.MapPath(AppDataVirtualPath);
            string documentPath = Path.Combine(appDataPath, path);
            return File(documentPath, "application/octet-stream", Path.GetFileName(path));
        }


        [HttpPost]
        public ActionResult LoadFileBrowserTreeData(LoadFileBrowserTreeDataParameters parameters)
        {
            object data = _coreHandler.LoadFileBrowserTreeData(parameters);
            if (data == null)
                return new EmptyResult();

            return Json(data);
        }
        #region Private methods

        private string[] GetImageUrls(string path, int startingPageNumber, int pageCount, int? pageWidth, int? quality)
        {
            RouteValueDictionary routeValueDictionary = new RouteValueDictionary()
            {
                {"path", path},
                {"width", pageWidth},
                {"quality", quality},
            };

            string[] pageUrls = new string[pageCount];
            for (int i = 0; i < pageCount; i++)
            {
                routeValueDictionary["pageIndex"] = startingPageNumber + i;
                pageUrls[i] = ConvertUrlToAbsolute(new UrlHelper(Request.RequestContext).Action("GetDocumentPageImage", routeValueDictionary));
            }
            return pageUrls;
        }


        private string ConvertUrlToAbsolute(string inputUrl)
        {
            HttpRequestBase request = Request;
            string applicationHost = String.Format("{0}://{1}{2}", request.Url.Scheme, request.Url.Host,
                                                    request.Url.Port == 80 ? String.Empty : ":" + request.Url.Port);

            if (applicationHost.EndsWith("/"))
            {
                applicationHost = applicationHost.Substring(0, applicationHost.Length - 1);
            }
            string result = string.Format("{0}{1}", applicationHost, inputUrl);
            return result;
        }
        
        #endregion
    }
}