wrod pdf MP4... 等转数据流 进行下载 和 预览 wrod pdf 打印 pdf

<el-dialog :visible.sync="iframeOpen" title="文档" ref="appendixDialog" :show-close="true" :width="'900px'"
        class="dialog-div-pre-style" center>
        <div v-html="fileUrl"></div>
    </el-dialog>    

   // 下载pdf  和 wrod   MP4
        down(){
            const fileRoute = this.formData.responsibilityConfirmation ? this.formData.responsibilityConfirmation :
                '' // (新增与修改字段不同导致需要进行兼容)
            const type = fileRoute.substring(fileRoute.lastIndexOf('.') + 1).toLocaleLowerCase() // 后缀名
                this.fileUrl = process.env.VUE_APP_BASE_API + fileRoute
                    fetch(this.fileUrl).then(res => res.blob()).then(blob => { ///  MP4  转成文件流
                        const a = document.createElement('a');
                        document.body.appendChild(a)
                        a.style.display = 'none'
                        // 使用获取到的blob对象创建的url
                        const url = window.URL.createObjectURL(blob);
                          a.href = url;
                        // 指定下载的文件名
                        a.download = new Date().getTime() + "xxxx."+type;
                        a.click();
                        document.body.removeChild(a)
                        // 移除blob对象的url
                        window.URL.revokeObjectURL(url);
                    });
            
        },

         iframeOk() {
            // 读取  wrod  转成  html 渲染页面
            const fileRoute = this.formData.responsibilityConfirmation ?this.formData.responsibilityConfirmation :
                '' // (新增与修改字段不同导致需要进行兼容)
            const type = fileRoute.substring(fileRoute.lastIndexOf('.') + 1).toLocaleLowerCase() // 后缀名
            this.fileUrl = process.env.VUE_APP_BASE_API + fileRoute
            if(type=='pdf'){
                     window.open(this.fileUrl);
            }else{
                    this.iframeOpen = true
            this.fileName = '预览'
            if (type.indexOf('doc') !== -1 || type.indexOf('docx') !== -1) { // WORD
                this.fileType = 'doc'
                this.handlerDocPreview() // 现在不需要file对象,直接使用数据缓冲区
            }   
            }
            
        handlerDocPreview() {
            try {
                // ArrayBuffer
                const file = this.fileUrl
                this.fileUrl = '正在加载……'
                var xhr = new XMLHttpRequest()
                xhr.open('get', file, true)
                xhr.responseType = 'arraybuffer'
                const that = this
                xhr.onload = function(e) {
                    console.log(xhr)
                    if (xhr.status == 200) {
                        const data = new Uint8Array(xhr.response) // 可直接使用xhr.reponse
                        mammoth.convertToHtml({
                            arrayBuffer: data
                        }).then((result) => {
                            that.fileUrl = result.value
                        }).done()
                    }
                }
                xhr.send()
            } catch (e) {
                this.fileUrl = '<h1 style="text-align: center">' + this.emptyTips + '</h1>'
            }

        },

  
           // 打印内容
        printContext() {
            this.$print(this.$refs.print)
            this.$print(this.$refs.print, {
                'no-print': '.do-not-print-div'    //  这是不打印的 内容
            })
        },
image.png
image.png

image.png

image.png

print.js

 // 打印类属性、方法定义
/* eslint-disable */
 const Print = function (dom, options) {
  if (!(this instanceof Print)) return new Print(dom, options);

       this.options = this.extend({
     'noPrint': '.no-print'
          }, options);

      if ((typeof dom) === "string") {
this.dom = document.querySelector(dom);
    } else {
      this.isDOM(dom)
this.dom = this.isDOM(dom) ? dom : dom.$el;
 }

   this.init();
    };
      Print.prototype = {
     init: function () {
var content = this.getStyle() + this.getHtml();
this.writeIframe(content);
     },
    extend: function (obj, obj2) {
for (var k in obj2) {
  obj[k] = obj2[k];
}
return obj;
   },

      getStyle: function () {
var str = "",
  styles = document.querySelectorAll('style,link');
for (var i = 0; i < styles.length; i++) {
  str += styles[i].outerHTML;
}
str += "<style>" + (this.options.noPrint ? this.options.noPrint : '.no-print') + "{display:none;}</style>";

return str;
 },

          getHtml: function () {
var inputs = document.querySelectorAll('input');
var textareas = document.querySelectorAll('textarea');
var selects = document.querySelectorAll('select');

for (var k = 0; k < inputs.length; k++) {
  if (inputs[k].type == "checkbox" || inputs[k].type == "radio") {
    if (inputs[k].checked == true) {
      inputs[k].setAttribute('checked', "checked")
    } else {
      inputs[k].removeAttribute('checked')
    }
  } else if (inputs[k].type == "text") {
    inputs[k].setAttribute('value', inputs[k].value)
  } else {
    inputs[k].setAttribute('value', inputs[k].value)
  }
}

for (var k2 = 0; k2 < textareas.length; k2++) {
  if (textareas[k2].type == 'textarea') {
    textareas[k2].innerHTML = textareas[k2].value
  }
}

for (var k3 = 0; k3 < selects.length; k3++) {
  if (selects[k3].type == 'select-one') {
    var child = selects[k3].children;
    for (var i in child) {
      if (child[i].tagName == 'OPTION') {
        if (child[i].selected == true) {
          child[i].setAttribute('selected', "selected")
        } else {
          child[i].removeAttribute('selected')
        }
      }
    }
  }
}
// 包裹要打印的元素
// fix: https://github.com/xyl66/vuePlugs_printjs/issues/36
let outerHTML = this.wrapperRefDom(this.dom).outerHTML
return outerHTML;
    },
      // 向父级元素循环,包裹当前需要打印的元素
         // 防止根级别开头的 css 选择器不生效
        wrapperRefDom: function (refDom) {
let prevDom = null
let currDom = refDom
// 判断当前元素是否在 body 中,不在文档中则直接返回该节点
if (!this.isInBody(currDom)) return currDom

while (currDom) {
  if (prevDom) {
    let element = currDom.cloneNode(false)
    element.appendChild(prevDom)
    prevDom = element
  } else {
    prevDom = currDom.cloneNode(true)
  }

  currDom = currDom.parentElement
}

return prevDom
      },

    writeIframe: function (content) {
var w, doc, iframe = document.createElement('iframe'),
  f = document.body.appendChild(iframe);
iframe.id = "myIframe";
//iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;";
iframe.setAttribute('style', 'position:absolute;width:0;height:0;top:-10px;left:-10px;');
w = f.contentWindow || f.contentDocument;
doc = f.contentDocument || f.contentWindow.document;
doc.open();
doc.write(content);
doc.close();
var _this = this
iframe.onload = function(){
  _this.toPrint(w);
  setTimeout(function () {
    document.body.removeChild(iframe)
  }, 100)
}
       },

         toPrint: function (frameWindow) {
try {
  setTimeout(function () {
    frameWindow.focus();
    try {
      if (!frameWindow.document.execCommand('print', false, null)) {
        frameWindow.print();
      }
    } catch (e) {
      frameWindow.print();
    }
    frameWindow.close();
  }, 10);
} catch (err) {
  console.log('err', err);
}
       },
        // 检查一个元素是否是 body 元素的后代元素且非 body 元素本身
        isInBody: function (node) {
return (node === document.body) ? false : document.body.contains(node);
       },
       isDOM: (typeof HTMLElement === 'object') ?
function (obj) {
  return obj instanceof HTMLElement;
       } :
function (obj) {
  return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';
}
       };
         const MyPlugin = {}
      MyPlugin.install = function (Vue, options) {
// 4. 添加实例方法
 Vue.prototype.$print = Print
 }
 export default MyPlugin
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容