I am trying to download a runtime generated PDF file (PDF generated using iTextPDF) in Springboot Service and want to open that file in new tab via angular 6.0. I tried to follow this How to download a pdf file in angular which is generated on my server(springboot)? but getting error as 'Failed to load PDF document'. What is wrong in code?
Angular Compomnent:
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);
}
);
Angular Service:
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 Controller:
@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 Service:
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";
}