从HTML字符串

时间:2015-10-13 18:32:19

标签: javascript c# asp.net-mvc azure pdf-generation

所以,我试图通过将HTML字符串传递给服务器来生成PDF文件,以使用NReco库http://www.nrecosite.com/pdf_generator_net.aspx生成字节流,然后将其返回到客户端,但是在转换为blob格式之后使用FileSaver库https://github.com/eligrey/FileSaver.js/保存,保存的文件无法打开。

以下是我的代码:

控制器

        string HtmlContent = model.HtmlContent;


        string PageType = gradeReportPdfBindingModel.PageType;
        string FileName = gradeReportPdfBindingModel.FileName;

        var pdfDoc = new HtmlToPdfConverter();

        if (string.IsNullOrEmpty(PageType))
            pdfDoc.Orientation = PageOrientation.Default;
        else
        {
            if (PageType == "Landscape")
                pdfDoc.Orientation = PageOrientation.Landscape;
            else
                pdfDoc.Orientation = PageOrientation.Portrait;
        }
         var pdfBytes = pdfDoc.GeneratePdf(HtmlContent);
         HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        result = Request.CreateResponse(HttpStatusCode.OK);
        result.Content = new ByteArrayContent(pdfBytes);
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        result.Content.Headers.ContentDisposition.FileName = FileName;
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

        return result;

Customer.js

 Customer.Export(exportModel).then(function (response) {
            var file = new Blob([response.data], { type: 'application/pdf' });
            saveAs(file, fileName);
        });

HTTP POST呼叫

   Export: function (model) {
            return $http({
                method: 'POST',
                headers: {
                    accept: 'application/pdf'
                },
                url: appSettings.serverPath + '/customer/export',
                headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
                data: $.param(model),
            });
        },

来自浏览器控制台的响应日志:

Object { data: "%PDF-1.4 1 0 obj << /Title (��) /Cr…", status: 200, headers: ed/<(), config: Object, statusText: "OK" }

编辑1: 我试图将结果作为HttpResponseMessage返回。我怎样才能在javascript端使用它?

编辑2: 我想到了。我就是这样做的。   控制器:

    [HttpPost]
    [Route("export")]
    public IHttpActionResult GeneratePdf(model)
    {
     var pdfBytes = pdfDoc.GeneratePdf(HtmlContent);

        var policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(300), Priority = CacheItemPriority.NotRemovable };
        var cacheId = Guid.NewGuid().ToString();
        MemoryCache.Default.Add("pdfBytes_" + cacheId, pdfBytes, policy);

        return Ok(cacheId);
  }

  [Authorize]
  [HttpGet]
  [Route("getPdf/{cacheId}/{fileName}")]
    public HttpResponseMessage DownloadPdf(Guid CacheId, string FileName)
    {
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
        try
        {
            var pdfBytes = (Byte[])MemoryCache.Default.Get("pdfBytes_" + CacheId);
            MemoryCache.Default.Remove("pdfBytes_" + CacheId);

            using (MemoryStream memorystream = new MemoryStream(pdfBytes))
            {
                response = Request.CreateResponse(HttpStatusCode.OK);
                response.Content = new ByteArrayContent(memorystream.ToArray());
                response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
                response.Content.Headers.ContentDisposition.FileName = FileName;
                response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
                return response;
            }
        }

customer.js:

    Customer.Export(model).then(function (response) {
            Customer.DownloadPdf(response.data, fileName).then(function (response) {
                var file = new Blob([response.data], { type: "application/pdf" });
                saveAs(file, fileName);
            }).catch(function (response) {
                console.error('Error', response.status, response.data);
            });

        });

Http电话:

   Export: function (model) {
            return $http({
                method: 'POST',
                url: appSettings.serverPath + '/customer/export',
                headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
                data: $.param(model),
            });
        },
        DownloadPdf: function (cacheId, fileName) {
            return $http({
                method: 'GET',
                headers: {
                    accept: 'application/pdf'
                },
                responseType: 'arraybuffer',
                url: appSettings.serverPath + '/customer/downloadPdf/' + cacheId + '/' + fileName,
                headers: { 'Content-Type': 'application/pdf' }
            });
        }

我基本上在我的本地开发机器上测试它并且它可以工作,但是当我发布它的Azure Web App时,我无法通过POST调用并且它在一段时间后返回状态500。不知道为什么,但我怀疑我正在使用的MemoryCache。任何想法都会被贬低。

感谢。

0 个答案:

没有答案