OnlyOffice的安装及使用

4,669 阅读6分钟

一、镜像安装

用OnlyOffice提供的Docker镜像安装OnlyOffice是比较方便和推荐的方法,因为它可以自动配置OnlyOffice的所有依赖项,从而减少安装和配置的复杂度。

(做云原生时代的弄潮儿,Docker和K8s在实际部署使用较广发,后期再说下,Docker和K8s的管理。)

  1. 首先需要安装Docker,可以参考官方文档进行安装:docs.docker.com/engine/inst…
  2. 安装完Docker后,可在终端中通过命令sudo docker run --net host -i onlyoffice/documentserver下载OnlyOffice的Docker镜像,在安装过程中可以根据需要自定义一些参数,例如指定文件存储路径、指定管理员账号等。当然OnlyOffice 如果不知道怎么配置或者下载不成功,我提供了一个配置供大家学习使用。 链接:pan.baidu.com/s/1N13U9TtC… 提取码:hegj
  3. 等待下载完成后,使用命令sudo docker ps查看已启动的容器,可以看到OnlyOffice服务已经运行起来了。
  4. 接下来,通过浏览器访问http://服务器IP:端口号/,即可进入OnlyOffice服务管理页面,输入管理员账号和密码进行登录。
  5. 在管理页面中,可以管理用户、添加文档库、设置文档类型等,同时也可以将OnlyOffice与其他系统整合。

二、脚本安装

如果您不想使用Docker镜像,或者环境不允许,也可以通过以下方式安装OnlyOffice。

  1. 使用安装脚本进行安装

OnlyOffice提供了一个安装脚本,可以自动下载和安装所有必要的依赖项,并配置OnlyOffice服务。使用该方法安装OnlyOffice可以按照以下步骤进行操作:

  • 下载安装脚本
wget http://download.onlyoffice.com/install/install.sh
  • 将安装脚本赋予可执行权限并执行
sudo chmod +x install.sh
sudo ./install.sh
  • 在脚本执行期间,您需要回答几个问题以配置OnlyOffice服务

如果您希望卸载OnlyOffice服务,可以运行以下命令:

sudo apt-get remove onlyoffice-doc* onlyoffice-communityserver*
sudo apt-get autoremove
  1. 从源代码编译安装

如果您是开发人员或对OnlyOffice的源代码进行修改,则可以从源代码手动编译和安装OnlyOffice。这种方法需要下载OnlyOffice的源代码和编译器,需要一些专业的技能和经验。

总而言之,使用Docker镜像是只使用OnlyOffice最简单的方式,但是如果您不想使用Docker镜像,使用安装脚本或从源代码编译安装OnlyOffice也是可行的。

安装好的页面长这样:

添加图片注释,不超过 140 字(可选)

或者长这样

添加图片注释,不超过 140 字(可选)

三、前端代码实例

以最最简单的html为例

<!DOCTYPE html>
<html lang="en">
​
​
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>在线预览</title>
</head><body><div class="form" style="width:100%;height:800px;">
        <div id="iframeEditor"></div>
    </div></body><script type="text/javascript"  src="./jquery-3.7.0.min.js"></script>
<script type="text/javascript" >
​
​
$(function() {
    // 获取onlyoffice 路径
    var onlyoffice_url = "http://onlyoffice服务的 IP:端口/";
    var onlyoffice_js = onlyoffice_url + "/web-apps/apps/api/documents/api.js";
    loadJS(onlyoffice_js, function() {
                var fileType =  "docx";
                var fileName = "222.docx";
                var key = "1111";//每次打开后要重新获取,否则编辑后打开还是编辑前的文件,如果是预览文件就没关系
                var mode = "edit";//view查看
                //nginx代理文件
                var url = "http://代理文件的 IP:端口/onlyoffice_filePath/222.docx";
                //编辑保存回调函数,保存的文件可以覆盖原来的文件,也可以新生成 (保证此接口是通的否则,文件显示不出来)
                var callbackUrl = "http://回调函数的 IP:端口/xxxxxx/CallBackServlet?fileName=222.docx";
                var documentType = getDocumentType(fileType);
                var config = {};
                
                // 预览
                if ("edit" == mode) {
                    config = {
                        document : {
                            fileType : fileType,
                            key :key,
                            title : fileName,
                            url : url
                        },
                        documentType : documentType,
                        editorConfig : {
                            callbackUrl : callbackUrl,
                            customization : {
                                forcesave : true,
                                leftMenu : false,
                                rightMenu : false,
                                chat : true,
                                comments : false,
                                about : false,
                                help : false,
                                plugins : false
                            },
                            user : {
                                id : "1",
                                name : "用户1"
                            },
                            hideRightMenu : false,
                            mode : mode,
                            lang : "zh-CN"
    
                        },
                        height : "100%",
                        width : "100%",
                        lang : "zh-CN"
                    };
    
                } else {
                
                    //文件预览
                    config = {
                        document : {
                            fileType : fileType,
                            key : key,
                            title : fileName,
                            url : url
                        },
                        documentType : documentType,
                        editorConfig : {
                            customization : {
                                forcesave : false,
                                help : false,
                                toolbar : false,
                                statusBar : false,
                                autosave : false,
                                leftMenu : false,
                                rightMenu : false,
                                chat : false,
                                comments : false,
                                about : false,
                                help : false,
                                plugins : false,
                                spellcheck : false,
                                compactHeader : false
                            },
                            user : {
                                id : "2",
                                name : "用户2"
                            },
                            hideRightMenu : true,
                            mode : mode,
                            lang : "zh-CN"
    
                        },
                        height : "100%",
                        width : "100%",
                        lang : "zh-CN"
                    };
    
                }
                docEditor = new DocsAPI.DocEditor("iframeEditor", config);
            });
    
    /**
     * 预览类型转化
     */
    function getDocumentType(fileType) {
        var ExtsDocument = new Array(".doc", ".docx", ".docm", ".dot", ".dotx",
                ".dotm", ".odt", ".fodt", ".ott", ".rtf", ".txt", ".html",
                ".htm", ".mht", ".pdf", ".djvu", ".fb2", ".epub", ".xps");
        var ExtsSpreadsheet = new Array(".xls", ".xlsx", ".xlsm", ".xlt",
                ".xltx", ".xltm", ".ods", ".fods", ".ots", ".csv");
    
        var ExtsPresentation = new Array(".pps", ".ppsx", ".ppsm", ".ppt",
                ".pptx", ".pptm", ".pot", ".potx", ".potm", ".odp", ".fodp",
                ".otp");
        fileType = "." + fileType;
        if (ExtsDocument.indexOf(fileType.toLowerCase()) > -1) {
            return "text";
        }
        if (ExtsSpreadsheet.indexOf(fileType.toLowerCase()) > -1) {
            return "spreadsheet";
        }
        if (ExtsPresentation.indexOf(fileType.toLowerCase()) > -1) {
            return "presentation";
        }
    }
    
    
    /**
    *进入页面后动态加载onlyOffice所需要引入的js(实际运用引入js时IP和端口一般不固定)
    */
    function loadJS(url, callback) {
        var script = document.createElement('script'), fn = callback
                || function() {
                };
        script.type = 'text/javascript';
        if (script.readyState) {
    
            script.onreadystatechange = function() {
    
                if (script.readyState == 'loaded'
                        || script.readyState == 'complete') {
    
                    script.onreadystatechange = null;
                    fn();
                }
            };
        } else {
            // 其他浏览器
            script.onload = function() {
                fn();
            };
        }
        script.src = url;
        document.getElementsByTagName('head')[0].appendChild(script);
    }
​
});
​
</script>
</html>

再次强调如果你检查文件路径,onlyoffice服务路径,出现了下面这样的情况不要慌,那就是我说的保存回调函数不通,文件出不来

添加图片注释,不超过 140 字(可选)

四、后端代码实例

官网给出的测试代码也很多,我写了个Servlet,使用的时候注意几点,多人协同时状态6,2根据业务可以控制,以及前端的key多人协同,key相同打开就是一样的。

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.URL;
import java.util.Scanner;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import com.jb.util.platform.Platform;
​
/**
​
 * 将编辑后的文件返回保存
   */
   @WebServlet(name = "CallBackServlet", urlPatterns = {"/CallBackServlet"})
   public class CallBackServlet extends HttpServlet {
   private static final long serialVersionUID = 1L;
   private static final String sep = File.separator;
   @Autowired
   private JdbcTemplate jdbcTemplate;
​
   public CallBackServlet() {
       super();
   }
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,      IOException {
          PrintWriter writer = null;
          JSONObject jsonObj=null;
           try {
               writer = response.getWriter();
               @SuppressWarnings("resource")
            Scanner scanner = new Scanner(request.getInputStream()).useDelimiter("\A");
               String body = scanner.hasNext() ? scanner.next() : "";
               try {
                jsonObj = (JSONObject) new JSONParser().parse(body);
            } catch (org.json.simple.parser.ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }      
​
               /*
                0-找不到具有密钥标识符的文档,
                1-正在编辑文档,
                2-文件已准备好保存,
                3-发生文档保存错误,
                4-文件已关闭,没有更改,
                6-正在编辑文档,但保存了当前文档状态,
                7-强制保存文档时出错。
                * */         
             
                if ((long) jsonObj.get("status") == 2) {
                   /*
                    * 当我们关闭编辑窗口后,十秒钟左右onlyoffice会将它存储的我们的编辑后的文件,,此时status = 2,
                    通过request发给我们,我们需要做的就是接收到文件然后回写该文件。
                    * */
                   /*
                    * 定义要与文档存储服务保存的编辑文档的链接。当状态值仅等于2或3时,存在链路。
                    * */
                   String downloadUri = (String) jsonObj.get("url");
                   System.out.println("====文档编辑完成,现在开始保存编辑后的文档,其下载地址为:" + downloadUri);
                   //这里加在即的业务名
                  
                   URL url = new URL(downloadUri);
                   java.net.HttpURLConnection connection = 
                       (java.net.HttpURLConnection) url.openConnection();
                   InputStream stream = connection.getInputStream();
                   //更换为实际的路径
                   String filePath = "D://demo";
                File path = new File(filePath);
                File savedFile = new File(filePath+sep+fileName);
                   if(!path.exists()){
                    path.mkdirs();
                   }
                   try (FileOutputStream out = new FileOutputStream(savedFile)) {
                       int read;
                       final byte[] bytes = new byte[1024];
                       while ((read = stream.read(bytes)) != -1) {
                           out.write(bytes, 0, read);
                       }
                       out.flush();
                   }
                   connection.disconnect();
               }
           } catch (IOException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
           }
         
   }
​
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,     IOException {
    doGet(request, response);
   }
​
}

官网明确给出了不同语言,框架的测试代码。例如Java,Java Spring,PHP,Node.js,C#等。

测试代码下载地址:api.onlyoffice.com/editors/dem…

添加图片注释,不超过 140 字(可选)

以Java为例,使用OnlyOffice SDK进行二次开发的步骤如下:

  • 在项目依赖中添加OnlyOffice SDK
<dependency>
  <groupId>com.onlyoffice.documents</groupId>
  <artifactId>onlyoffice-documentserver-java-sdk</artifactId>
  <version>6.1.3</version>
</dependency>
  • 创建OnlyOffice DocumentServer客户端对象
DocumentServerClient client = new DocumentServerClient("http://your-documentserver.com/");
  • 请求Token
String token = client.security().requestToken();
  • 打开文档(文档的URL和Key需要进行参数替换)
EditorUrl editorUrl = client.editing().buildUrl(new DocumentRequest("document-url", "document-key"))
        .editable()
        .setToken(token)
        .build();

对于二次开发者而言,OnlyOffice API和SDK的使用难度并不大,并且提供了丰富的文档和示例来帮助开发者快速上手。