找回密码
 立即注册

QQ登录

只需一步,快速开始

zhlb

初级会员

38

主题

102

帖子

342

积分

初级会员

积分
342

[已处理] 导出pdf太慢

zhlb
初级会员   /  发表于:2023-11-15 10:03  /   查看:2647  /  回复:3
10金币
我们打印模板需要使用lodop打印,目前的实现思路是使用ARJS生成pdf,将blob对象转成文件流传给后端,返回一个pdf链接,然后将pdf文件地址传给lodop打印,现在发现前端生成pdf这一步耗时太久,麻烦问下,这里有什么优化方案吗,或者有其他的解决方案吗


report
          .load(reportResponse)
          .then(function () {
            return report.run()
          })
          .then(function (pageDocument) {
            return PdfExport.exportDocument(pageDocument, settings)
          })
          .then(function (result) {
            console.log(result)
            var file = new File([result.data], 'a.pdf', {
              type: 'application/json',
              lastModified: Date.now(),
            })
            var form = new FormData()
            // 文件
            form.append('File', file)
            // 调用封装好的上传方法,传给后台FormData
            upload(form)
              .then((res) => {
                that.loading = false
                if (res.Code == 10200) {
                  var strURLorContent = that.$filesUrl + res.Data.Path
                  let w, h
                  if (reportResponse.ReportSections) {
                    w = reportResponse.ReportSections[0].Page.PageWidth
                    h = reportResponse.ReportSections[0].Page.PageHeight
                  } else {
                    w = reportResponse.Page.PageWidth
                    h = reportResponse.Page.PageHeight
                  }
                  function repeatPrint(strURLorContent) {
                    LODOP.PRINT_INIT('测试PDF打印功能')
                    LODOP.SET_PRINT_PAGESIZE(0, w, h, 'CreateCustomPage')
                    LODOP.SET_PRINTER_INDEX(iPrinterIndex)
                    if (strURLorContent.indexOf('https') == -1) {
                      LODOP.ADD_PRINT_PDF(0, 0, '100%', '100%', strURLorContent) //http链接
                    } else {
                      LODOP.ADD_PRINT_PDF(
                        0,
                        0,
                        '100%',
                        '100%',
                        this.demoDownloadPDF(strURLorContent)
                      ) //https链接
                    }

                    if (type == 'view') {
                      LODOP.PREVIEW()
                    } else {
                      LODOP.PRINT()
                    }
                  }
                  // 打印多次
                  for (let i = 0; i < that.count; i++) {
                    repeatPrint(strURLorContent)
                  }
                } else {
                  that.$message.error(res.Msg)
                }
              })
              .catch((response) => {
                that.loading = false
                that.$message.error('打印失败')
              })
          })


最佳答案

查看完整内容

您好,看了一下您的代码,应该没有更快的速度了,因为ARJS受限于是一个前段的空间,所以其实都是靠浏览器在做这些工作。本身确实速度上不是特别快。 我这边暂时有两个办法: 1.在页面加载之前就把需要下载的pdf流准备好。也就是正常的逻辑应该是在您点击某个按钮的时候,开始渲染和打印导出。您可以在这个页面进入时,就异步做渲染和导出,把最后的result.data的pdf流准备好,在用户点击时,直接传。这个就是相当于提前加载了。 ...

3 个回复

正序浏览
zhlb
初级会员   /  发表于:2023-11-15 14:02:04
3#
Eden.Sun 发表于 2023-11-15 12:27
问题描述:

ARJS导出PDF太慢。

你好,我了解你说的这个方法,和我说的不是一个东西,我需要实现的是一键打印,浏览器打印预览也不需要弹出来的,官方给的方案是安装一个桌面应用实现,我们现在使用lodop已经实现了,我现在问的问题是生成pdf太慢了,传入一条数据和传入50条数据时间相差好几十秒,这个是什么原因导致的,有没有解决办法
回复 使用道具 举报
Eden.SunWyn认证
超级版主   /  发表于:2023-11-15 12:27:32
2#
问题描述:

ARJS导出PDF太慢。


问题解决:
您好,这个报表导出的pdf文件有大呢。文件如果大的话,导出是会慢一些。

您看一下我们版主的无误预览打印方案。
https://gcdn.grapecity.com.cn/showtopic-151526-1-1.html
回复 使用道具 举报
最佳答案
最佳答案
Felix.LiWyn认证
超级版主   /  发表于:2023-11-15 10:03:09
来自 4#
您好,看了一下您的代码,应该没有更快的速度了,因为ARJS受限于是一个前段的空间,所以其实都是靠浏览器在做这些工作。本身确实速度上不是特别快。

我这边暂时有两个办法:
1.在页面加载之前就把需要下载的pdf流准备好。也就是正常的逻辑应该是在您点击某个按钮的时候,开始渲染和打印导出。您可以在这个页面进入时,就异步做渲染和导出,把最后的result.data的pdf流准备好,在用户点击时,直接传。这个就是相当于提前加载了。但是会有额外的资源消耗(浏览器)

2.就是用我们另一款产品。AR,但是这个可能集就得重新购买设计。AR因为是服务端的。所以本身渲染速度都比AR快很多。而且本身是后端的。可以自定义写导出接口。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部