前端 html 转 docx

1、原料

html-docx-js https://github.com/evidenceprime/html-docx-js

2、核心代码

   
   // 传入的 contentDocument 最好是克隆对象 下面的操作将对对象进行更改
   function htmlToDocx (contentDocument) {
        
      // 获取当前文档中的图片标签 将图片的url地址转为 base64 地址格式 可以保存到 docx 中
      var regularImages = contentDocument.querySelectorAll("img");
      //获取canvas 
      var canvas = document.createElement('canvas');
      // 对应的CanvasRenderingContext2D对象(画笔) 
      var ctx = canvas.getContext('2d');
      var index = 0;
      [].forEach.call(regularImages, function (imgElement) {
       // 图片跨域问题
       var img = new Image(), //创建新的图片对象 
       base64 = '' ;  //  base64
       // 设置跨区标识 
       img.setAttribute("crossOrigin",'Anonymous');
       // 图片添加时间戳 禁止磁盘加载 解决跨域问题 跨域前提 图片服务器返回有跨域标识 Access-Control-Allow-Origin: *
       img.src = imgElement.getAttribute("src")+"?t="+new Date().getTime();
       // 等待图片加载完毕
       img.onload = function(){
            //图片加载完,再draw 和 toDataURL
            // preparing canvas for drawing
            canvas.width = imgElement.width;
            canvas.height = imgElement.height;
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            
            ctx.drawImage(img,0,0);
            // 如果图片不支持跨域 这里就会失败 可以做提示
            base64 = canvas.toDataURL("image/png"); 
            imgElement.setAttribute('src', base64);

            index++;
            if(index==regularImages.length){
                // 当图片全部加载完毕可以执行生成 doc
                canvas.remove();
                var content = '<!DOCTYPE html>' + elDom.outerHTML;
                var converted = htmlDocx.asBlob(content);
                saveAs(converted, 'test.docx');
            }
        };
      })
    }
 
    htmlToDocx(contentDocument.getElementById("editer"));

3、图片跨域问题

1、 图片服务器返回有跨域标识 Access-Control-Allow-Origin: *

2、图片不能从缓存中加载


  var canvas=document.getElementById("canvas"), //获取canvas 
  ctx = canvas.getContext("2d"), //对应的CanvasRenderingContext2D对象(画笔) 
  img = new Image(),//创建新的图片对象 
  base64 = '' ;//base64
  img.setAttribute("crossOrigin",'Anonymous') 
  
  // 禁用缓存加载  crossOrigin Anonymous 才会生效
  img.src = 'http://www.xxxx.png?t='+new Date().getTime(); 
  img.onload = function(){    
     // 图片加载完,再draw 和 toDataURL 
      ctx.drawImage(img,0,0); 
      base64 = canvas.toDataURL("image/png"); 
  };

4、资料参考

https://segmentfault.com/q/1010000008648867/a-1020000008651198

https://segmentfault.com/q/1010000017415625?utm_source=sf-similar-question

https://blog.csdn.net/weixin_30668887/article/details/98822699

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容