记录一次使用JS生成word后端转换PDF功能

大致思路

接到一个需求,将vue页面生成word,并且也可以生成pdf

前端VUE生成WORD

因为使用的是VUE大致也是分为两种方法

  1. jquery的wordExport插件(这里使用VUE不建议使用jquery不详细阐述想研究可以自己去试一下)
  2. 大佬自己改造的js-export-word插件,和jQuery的wordExport效果差不多但是感觉还是比较好用的,而且给大佬提issue也是很快就回复了GitHub - huangbohang/export-word: 一个html导出为word的JS库

具体实现

导入方法

//导入方法
npm install -D js-export-word

页面引用(这里我修改了库里面的方法方便导出pdf)

import exportWord from 'js-export-word'

const wrap = document.getElementById('test')
const config = {
      addStyle:true, // 是否导出样式,默认为true,此操作会将所有样式转换成行内样式导出
      fileName:'测试文件', // 导出文件名
      toImg:['.need-to-img','.bg-danger'], // 页面哪些部分需要转化成图片,例如echart图表之类
      success(){} // 完成之后回调,一般页面篇幅比较大,时间比较长
}
exportWord(wrap,config,'word') //这里进行了改造因为要修改里面的方法将word文件流提交到后台

修改JS方法

async function exportWord(dom, config,type ){
  const installApp = new App(dom, config)
  await installApp.init()
  if (type=='word'){
    installApp.exportWord()
  } else {
    installApp.exportPdf()
  }
}
添加导出PDF方法
//导出pdf
exportPdf(){
  var blob = wordexport(this.c_dom);
  var formData = new FormData();
  formData.append("file",blob,"blob.doc");
  var fileName =this.config.fileName;
  send(formData,fileName);
  function send(formData,fileName) {
    axios
      .post(process.env.VUE_APP_BASE_API + "/common/upload/Word2Pdf", formData,{responseType: "arraybuffer",Authorization: "Bearer " + getToken() })
      .then(function(res) {
        const link = document.createElement('a')
        let blob = new Blob([res.data], {type: 'application/pdf;chartset=UTF-8'})
        link.style.display = 'none'
        link.href = URL.createObjectURL(blob)
        // 文件名称,可自定义,也可以从后端获取
        link.download = fileName+".pdf"
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
      })
      .catch(function(error) {
        console.log(error);
      });
  }
}

后端转换PDF

在网上找到多种方式

1、documents4j(依赖于windows系统和office)

2、expire(免费的版本只能转换3页)

3、aspose(是付费的但是网上有License,还是比较方便的)

4、itextpdf(转换之后的pdf格式混乱,字体混乱,也没有深入研究)

最后也是看到了大佬的博客docx文件转pdf,使用aspose words 转pdf,并且解决表格格式错乱_Mr_going的博客-CSDN博客_aspose docx转pdf

参照这个博客完成了转换,只有分页换行的时候有几行换页了,但是样式没有混乱比较符合。

这里也是大致整理一下整体流程(有部分是贴的大佬的博客)

具体实现

导入工具包的过程参照大佬的博客吧,我就写一下控制层接口的处理

需要修改工具包让工具返回FileOutputStream类型的值

@PostMapping("/common/upload/Word2Pdf")
    public  void Word2Pdf(MultipartFile file,HttpServletResponse response) {
        File inputWord = null;
        try {
            //创建临时输入文件doc
            inputWord=File.createTempFile("tmp.doc", null);
            file.transferTo(inputWord);
            inputWord.deleteOnExit();
            InputStream docxInputStream = new FileInputStream(inputWord);
            //创建临时输出文件pdf
            File outf1 = File.createTempFile("temp-file-name", ".tmp");
            outf1.deleteOnExit();

            //转换PDF
            FileOutputStream os = WordToPdfUtil.docxToPdf(docxInputStream,outf1);
//            返回文件流
            response.setContentType("multipart/form-data");
            //为文件重新设置名字,采用数据库内存储的文件名称
            response.addHeader("Content-Disposition", "attachment; filename=\"" + "cs.pdf" + "\"");

            //读取文件流并转化
             FileInputStream ips = null;
            ServletOutputStream out = null;
            ips = new FileInputStream(outf1);
            out = response.getOutputStream();
            int len = 0;
            byte[] buffer = new byte[1024 * 10];
            while ((len = ips.read(buffer)) != -1){
                out.write(buffer,0,len);
            }
            //写入
            out.flush();

            try {
                out.close();
                ips.close();
            } catch (IOException e) {
                System.out.println("关闭流出现异常");
                e.printStackTrace();
            }
            return ;

        } catch (Exception e) {
            e.printStackTrace();
            return ;
        }
    }

完成导出

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用现代浏览器的 `window.print()` 方法来打印 PDF 数据流。具体实现步骤如下: 1. 后端返回 PDF 数据流 首先,后端需要将 PDF 数据以二进制流的形式返回给前端。你可以使用类似于以下的代码来实现: ```java @RequestMapping(value = "/downloadPdf", method = RequestMethod.GET) public ResponseEntity<byte[]> downloadPdf() throws IOException { byte[] pdfBytes = getPdfBytes(); // 获取 PDF 数据流 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_PDF); headers.setContentDispositionFormData("attachment", "file.pdf"); headers.setContentLength(pdfBytes.length); return new ResponseEntity<>(pdfBytes, headers, HttpStatus.OK); } ``` 2. 前端获取 PDF 数据流并打印 在前端,你可以使用类似于以下的代码来获取 PDF 数据流并打印: ```javascript axios.get('/downloadPdf', { responseType: 'blob' }) .then(response => { const blob = new Blob([response.data], { type: 'application/pdf' }); const url = URL.createObjectURL(blob); const iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = url; document.body.appendChild(iframe); iframe.contentWindow.print(); }) .catch(error => { console.error(error); }); ``` 这段代码会向后端请求 PDF 数据流,并将其转换成 Blob 对象。然后,它会创建一个隐藏的 iframe 元素,并将其 src 属性设置为 PDF 数据流的 URL。最后,它会调用 iframe 的 `contentWindow.print()` 方法来打印 PDF。 这样就可以实现从后端获取 PDF 数据流并打印的功能了。希望对你有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值