angular 使用iframe加载后端返回的pdf二进制流,通过blob转换地址,在iframe中预览文件,效果与从浏览器打开一致

本文介绍了如何在Angular应用中,通过下载后端返回的PDF二进制流,将其转换为Blob对象并安全地在IFrame中预览,确保效果与直接在浏览器中打开一致。涉及到的技术包括HTTP请求、DOM安全、Blob处理以及Word转PDF的工具如Word2pdfUtils。
摘要由CSDN通过智能技术生成

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();
        }
    }

在这里插入图片描述

如有好的意见可以留言共同学习
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值