예제 #1
0
        public async Task <IActionResult> Convert()
        {
            StringValues clientParam;
            StringValues keyParam;
            StringValues orientationParam;
            StringValues pageSizeParam;
            var          hasClient      = Request.Query.TryGetValue("client", out clientParam);
            var          hasKey         = Request.Query.TryGetValue("key", out keyParam);
            var          hasOrientation = Request.Query.TryGetValue("orientation", out orientationParam);
            var          hasPageSize    = Request.Query.TryGetValue("pageSize", out pageSizeParam);
            var          client         = hasClient && clientParam.Count > 0 ? clientParam[0] : "";
            var          key            = hasKey && keyParam.Count > 0 ? keyParam[0] : "";
            var          orientation    = hasOrientation && orientationParam.Count > 0 ? orientationParam[0] : "portrait";
            var          pageSize       = hasPageSize && pageSizeParam.Count > 0 ? pageSizeParam[0] : "A4";

            if (!_clientKeys.ContainsKey(client) || _clientKeys[client] != key)
            {
                return(new NotFoundResult());
            }

            var formData = HttpContext.Request.Form;
            var files    = formData.Files;
            var docFile  = files.Where(f => f.FileName == "doc.html").FirstOrDefault();

            IActionResult response = null;

            if (docFile != null)
            {
                var tempFolder = $"{System.IO.Path.GetTempPath()}{Guid.NewGuid()}";
                Directory.CreateDirectory(tempFolder);

                foreach (var file in files)
                {
                    if (file.FileName != "doc.html")
                    {
                        await System.IO.File.WriteAllBytesAsync($"{tempFolder}/{file.FileName}", ReadAllBytes(file.OpenReadStream()));
                    }
                }

                try
                {
                    using (var htmlSource = docFile.OpenReadStream())
                        using (var pdfDest = new ByteArrayOutputStream())
                        {
                            var writer = new PdfWriter(pdfDest);
                            var pdfDoc = new PdfDocument(writer);
                            pdfDoc.SetTagged();

                            PageSize ps = PageSize.A4;

                            if (pageSize == "A3")
                            {
                                ps = PageSize.A3;
                            }

                            if (orientation == "landscape")
                            {
                                ps = ps.Rotate();
                            }

                            pdfDoc.SetDefaultPageSize(ps);

                            var converterProperties = new ConverterProperties();

                            var fp = new DefaultFontProvider();
                            fp.AddDirectory(tempFolder);
                            converterProperties.SetFontProvider(fp);

                            converterProperties.SetImmediateFlush(true);
                            converterProperties.SetBaseUri(new Uri(tempFolder).AbsoluteUri);
                            HtmlConverter.ConvertToPdf(htmlSource, pdfDoc, converterProperties);
                            var bytes = pdfDest.ToArray();
                            response = new FileContentResult(bytes, "application/pdf");
                        }
                }
                catch (Exception ex)
                {
                    response = StatusCode(500, new { error = ex.Message, stackTrace = ex.StackTrace });
                }

                Directory.Delete(tempFolder, true);
            }
            else
            {
                response = StatusCode((int)HttpStatusCode.BadRequest, new { error = "No doc file provided" });
            }

            return(response);
        }