在服务器(ASP.NET Core)中生成PDF,然后在浏览器(Angular)中检索



我正在使用 asp.net core itextSharp 生成PDF报告并发送到浏览器。

[HttpGet]
public async Task<IActionResult> GetStream(string ids)
{
  try
        {
            List<int> labRequestIds = JsonConvert.DeserializeObject<List<int>>(requestIds);
            MemoryStream ms = new MemoryStream();
            Document doc = new Document(PageSize.A4, 30f, 30f, 30f, 30f);
            PdfWriter writer = PdfWriter.GetInstance(doc, ms);
            doc.Open();
            await CreatePlateDoc(labRequestIds, doc);
            doc.Close();
            writer.Flush();
            ms.Seek(0, SeekOrigin.Begin);
            return File(ms, "application/pdf");
         }
}

然后使用Angular(Typescript(,我会在浏览器中获得响应:服务:

getStream(requestIds: Array<number>) {
    return new Promise((resolve, reject) => {
        this.http.get(AppConfig.LrmApiUrl + '/fileGenerator/plates'
            + '?requestIds=' + JSON.stringify(requestIds)
            , { headers: this.authService.getHeaders() })
            .subscribe((data:any) => {
                console.log(data);
                if (data) {
                    resolve(data._body);
                }                 
            },
            err => reject(Tools.handleResponseError(err))
        );
    });
}

在控制器中尝试下载使用Filesaver.js创建的PDF这样:

downloadClick() {      
    this._fileGeneratorService.getPlateStream(this.selectedRequestIds)
        .then(data => {
            let saveAs = require('file-saver');
            let name = this.selectedRequests.map(function (x) {
                return x.code;
            }).join();
            let blob = new Blob([data], { type: 'application/pdf });
            saveAs(blob, name);
        })
        .catch(err => console.log(err));
}

,但它不起作用。下载的PDF是空的,但有信息。

最后我像这样解决了:

  public async Task<IActionResult> CreatePlatePdf(string dto)
    {
        try
        {
            List<int> dto= JsonConvert.DeserializeObject<List<int>>(dto);
            MemoryStream ms = new MemoryStream();
            Document doc = new Document(PageSize.A4, 30f, 30f, 30f, 30f);
            PdfWriter writer = PdfWriter.GetInstance(doc, ms);
            doc.Open();
            await this.CreateDoc(dto, doc);
            doc.Close();
            writer.Flush();
            byte[] byteInfo = ms.ToArray();
            ms.Write(byteInfo, 0, byteInfo.Length);
            ms.Seek(0, SeekOrigin.Begin);
            return this.File(ms, "application/pdf", fileName.pdf);
        }
}

并这样在客户端打电话:

downloadPlatesClick() 
{
    window.location.href = url_pdf;
}

现在,我唯一的问题是您可以在没有授权的情况下调用它。因此,任何人都知道如何在我的srvice的呼唤中添加授权(标题(?

相关内容

最新更新