OnlyOffice - 在webpack项目的页面上展示 PowerPoint

先看看效果吧:


效果图

环境

  • Ubuntu18.04 下 安装 docker
  • webpack cli2.0

Step1: 安装 docker

请参考 Docker安装-Ubuntu16.04

Step2: 启动 doucmentserver

注意:如果下载镜像比较慢,可以考虑指定国内源, 在 /etc/docker/ 下新建一个文件名 daemon.json 并往内添加

{
     "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
sudo docker run -i -t -d -p 8090:80 --restart=always \
    -v /app/onlyoffice/DocumentServer/logs:/var/log/onlyoffice  \
    -v /app/onlyoffice/DocumentServer/data:/var/www/onlyoffice/Data  \
    -v /app/onlyoffice/DocumentServer/lib:/var/lib/onlyoffice  onlyoffice/documentserver

Step3: 页面显示 PowerPoint

test.html

<!DOCTYPE HTML>
<html>
<body>
  <div id="placeholder"></div>
  <!-- 修改为自己搭建的 documentserver ip 和端口 -->
  <script type="text/javascript" src="http://documentserver ip:port/web-apps/apps/api/documents/api.js"></script>
  <script language="javascript" type="text/javascript">

    new DocsAPI.DocEditor("placeholder", {
      "document": {
        "fileType": "pptx",
        "key": "dfes21de", // 更新不同的key 
        "title": "测试pptx",
        "url": "https://sample-site.com/ppt/sample1.pptx"  // 修改为可访问的 pptx 文件
        
      },
      "documentType": "presentation",
      "width": "1000px",
      "height": "600px",
      // "editorConfig": {
      //   "callbackUrl": "编辑word后保存时回调的地址,这个api需要自己写了,将编辑后的文件通过这个api保存到自己想要的位置"
      // },
      "permissions": {
        "comment": false,
        "download": false,
        "edit": false, //(文件是否可以编辑,false时文件不可编辑)
        "fillForms": false,
        "print": false,
        "review": false
      }
    });
  </script>
</body>
</html>

演示效果:


演示效果

Step4: 在vue中 测试

由于需要导入 http://documentserver ip:port/web-apps/apps/api/documents/api.js, 因此,创建一个组件用来专门引入外部js文件。

// src/common/importJS.js
// 导入外部js
import Vue from 'vue'

Vue.component('remote-script', {
  render: function (createElement) {
    var self = this;
    return createElement('script', {
      attrs: {
        type: 'text/javascript',
        src: this.src
      },
      on: {
        load: function (event) {
          self.$emit('load', event);
        },
        error: function (event) {
          self.$emit('error', event);
        },
        readystatechange: function (event) {
          if (this.readyState == 'complete') {
            self.$emit('load', event);
          }
        }
      }
    });
  },
  props: {
    src: {
      type: String,
      required: true
    }
  }
});

然后,在组件内编写代码:

<template>
  <div class="hello">
    <remote-script :src="src"></remote-script>
    <!-- <h1>{{ msg }}</h1> -->
    <div>
      <button @click="Demo1">Demo1</button>
      <button @click="Demo2">Demo2</button>
      <button @click="Demo3">Demo3</button>
      <button @click="Sample0">Sample0</button>
      <button @click="Sample1">Sample1</button>
    </div>
    <br />
    <div id="sample">
      <div id="placeholder"></div>
    </div>
  </div>
</template>


<script>
import "@/common/importJS.js";

export default {
  name: "HelloWorld",
  data() {
    return {
      msg: "Welcome to Your Vue.js App",
      src: "http://documentserver ip:port/web-apps/apps/api/documents/api.js", // 修改为自己搭建的 documentserver ip 和端口 
      url: "https://sample-site.com/ppt/demo.pptx", // 可访问的文件url
    };
  },
  methods: {
    initPPT(url) {
      var x = document.getElementById("placeholder");
      var sample = document.getElementById("sample");

      if(x == null){
        // 先删除 sample 下的节点
        sample.removeChild(sample.childNodes[0])

        // 创建 placeholder 节点
        var mydiv = document.createElement("div");
        mydiv.id = "placeholder"

        sample.appendChild(mydiv);

      }

      console.log(x)
      var r = this.randomString(10);
      console.log(r);
      console.log(url);
      setTimeout(() => {
        new DocsAPI.DocEditor("placeholder", {
          document: {
            fileType: "pptx",
            key: r, // 更新不同的key
            title: "测试pptx",
            url: url,
          },
          documentType: "presentation",
          width: "900px",
          height: "600px",
          // "editorConfig": {
          //   "mode": "view"
          // },
          permissions: {
            comment: false,
            download: false,
            edit: false, //(文件是否可以编辑,false时文件不可编辑)
            fillForms: false,
            print: false,
            review: false,
          },
        });
      }, 5000);
    },
    Demo1() {
      var url = "https://sample-site.com/ppt/demo1.pptx";
      this.initPPT(url);
    },
    Demo2() {
      var url = "https://sample-site.com/ppt/demo2.pptx";
      this.initPPT(url);
    },
    Demo3() {
      var url = "https://sample-site.com/ppt/demo3.pptx";
      this.initPPT(url);
    },
    Sample0() {
      var url = "https://sample-site.com/ppt/sample.pptx";
      this.initPPT(url);
    },
    Sample1() {
      var url = "https://sample-site.com/ppt/sample1.pptx";

      this.initPPT(url);
    },

    randomString(len) {
      len = len || 32;
      var $chars =
        "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678"; /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
      var maxPos = $chars.length;
      var pwd = "";
      for (var i = 0; i < len; i++) {
        pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
      }
      return pwd;
    },
  },

  mounted() {
    this.initPPT(this.url);
  },
};
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h1,
h2 {
  font-weight: normal;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>

在 initPPT() 方法内, 由于生成PPT后,带id="placeholder" 的节点会被删掉,所以在点击按钮时候先判断,若不存在则需要手动创建。需要注意的是,不知道为啥 动画效果很多都会丢失。


Reference

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