【发布时间】:2020-07-06 12:24:25
【问题描述】:
我正在尝试在 Springboot 服务中下载运行时生成的 PDF 文件(使用 iTextPDF 生成的 PDF),并希望通过 Angular 6.0 在新选项卡中打开该文件。 我尝试关注此How to download a pdf file in angular which is generated on my server(springboot)?,但收到错误为“无法加载 PDF 文档”。 代码有什么问题?
角度组件:
this.service.PrintPDF(this.quotations).subscribe((data: Blob) => {
var file = new Blob([data], { type: 'application/pdf' })
var fileURL = URL.createObjectURL(file);
// if you want to open PDF in new tab
window.open(fileURL);
var a = document.createElement('a');
a.href = fileURL;
a.target = '_blank';
// a.download = 'bill.pdf';
document.body.appendChild(a);
a.click();
},
(error) => {
console.log('getPDF error: ',error);
}
);
角度服务:
PrintPDF(quotations: Quotation[]) {
let url = this.PDF_URL;
var authorization = 'Bearer ' + sessionStorage.getItem("key");
const headers = new HttpHeaders({
'Content-Type': 'application/json',
responseType: 'blob',
"Authorization": authorization
});
return this.http.post<Blob>(url, quotations, {
headers: headers, responseType:'blob' as 'json'}).pipe(map(
(response) => {
return response;
},
(error) => {console.log(error.json());}
));
Springboot 控制器:
@PostMapping(value = "/generatepdf")
public void downloadFile(@RequestBody List<QuotationDTO> quotationDTOs, HttpServletRequest request, HttpServletResponse response) {
try {
quotationService.GeneratePDF(quotationDTOs, request, response);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Springboot 服务:
public String GeneratePDF(java.util.List<QuotationDTO> quotationDTOs, HttpServletRequest request,
HttpServletResponse response) throws DocumentException, IOException {
response.setContentType("application/blob");
// Response header
response.setHeader("Pragma", "public");
response.setHeader("responseType", "blob");
response.setHeader("Content-Disposition", "attachment; filename=\"" + "Quotation" + "\"");
// OutputStream os = response.getOutputStream();
Document document = new Document(PageSize.A4, 50, 50, 5 , 5);
String current = sdf.format(new Timestamp(System.currentTimeMillis())).toString();
String reportName = "report"+current;
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(<Path>));
document.open();
// Write Content
document.close();
PdfWriter.getInstance(document, response.getOutputStream());
return reportName+".pdf";
}
【问题讨论】:
标签: angular spring-boot