我正在使用 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的呼唤中添加授权(标题(?