angular 使用iframe加载后端返回的pdf二进制流,通过blob转换地址,在iframe中预览文件,效果与从浏览器打开一致
html代码
<iframe #pdfFrame [src]="pdfSrc" frameborder="0" width="100%" height="100%"></iframe>
TS代码
pdfSrc: SafeResourceUrl | undefined;
constructor(
private httpService: HttpService,
private sanitizer: DomSanitizer,
) {}
this.httpService
.download(
new downloadReq('occupancyApplication/getConfirmationLevelCarePDF', {
elderlyId: 96,
}),
)
.then((data: Blob) => {
const blob = new Blob([data], {
type: 'application/pdf',
});
this.pdfSrc = this.sanitizer.bypassSecurityTrustResourceUrl(
window.URL.createObjectURL(blob),
);
});
请求方法
public download<T>(req: BaseRequest): Promise<Blob> {
const headers: HttpHeaders = new HttpHeaders({
'Content-Type': 'blob; charset=utf-8',
Authorization: this.token,
});
let observe = null;
observe = this.http.get<Observable<Blob>>(
this.serverUrl + req.path,
{
headers: headers,
observe: 'body',
withCredentials: false,
params: req.params,
responseType: 'blob' as 'json'
},
);
this.loaderService.show();
return lastValueFrom(observe)
.then((res?: any) => {
this.loaderService.hide();
return Promise.resolve(res);
})
.catch((e: HttpErrorResponse) => {
this.loaderService.hide();
return this.error(e);
});
}
controller
@GetMapping("/getStayingHealthRiskPDF")
public void getStayingHealthRiskPDF(
@RequestParam("elderlyId") Integer elderlyId, HttpServletResponse httpServletResponse) {
occupancyApplicationService.getStayingHealthRiskPDF(elderlyId, httpServletResponse);
}
service
void getStayingHealthRiskPDF(Integer elderlyId, HttpServletResponse httpServletResponse);
Impl word模板用的poi-tl
XWPFTemplate template =
XWPFTemplate.compile(
new File(
Objects.requireNonNull(
getClass()
.getResource("/templates/stayingHealthRiskTemplate.docx"))
.getFile())
.getPath())
.render(
new HashMap<String, Object>(16) {
{
put("groupName", bElderlyBaseMap.get("groupname"));
put("name", bElderlyBaseMap.get("elderlyname"));
put("sex", bElderlyBaseMap.get("sex"));
put("age", bElderlyBaseMap.get("age"));
put("date", bElderlyBaseMap.get("date"));
put("unit", bElderlyBaseMap.get(""));
put("diagnosisInfo", bElderlyBaseMap.get("diagnosisInfo"));
}
});
// template.writeAndClose(new FileOutputStream(bElderlyBaseMap.get("elderlyName") +
// ".docx"));
OutputStream out = httpServletResponse.getOutputStream();
// 转换为 pdf
Word2pdfUtils.convert(template.getXWPFDocument(), out);
word转PDF
public static void convert(XWPFDocument document, OutputStream out) {
try {
//将word转成pdf
PdfOptions options = PdfOptions.create();
PdfConverter.getInstance().convert(document, out, options);
} catch (
Exception e) {
e.printStackTrace();
}
}