如何将ONLYOFFICE与Python应用程序集成

ONLYOFFICE是一项功能强大的开源文档编辑器,可以将文本文档、电子表格和演示文稿、电子表单编辑功能集成任何编程语言编写的 Web 应用程序中。最新的7.5版本编辑器可以支持编辑PDF文件(批注、绘图等)。在本文中,我们会带你了解如何将ONLYOFFICE集成到的Python应用程序中。

为此,我们将在 Python 上创建一个简单的文档管理系统,并将 ONLYOFFICE 文档编辑器进行集成其实比你想象的更简单

Python 中的 DMS

在这一part中,我们编写一个 Python 应用程序,然后示例中展示与 ONLYOFFICE 的集成。计划集成编辑器的应用程序很可能具有需要打开以进行查看/编辑的文件列表。因此,让我们创建一个具有此功能的应用程序还应该支持下载文件。

我们使用 Bottle 框架。可以用 pip install Bottle 命令将其安装在工作目录中。现在我们需要创建文件main.py(应用程序的代码)和index.tpl(模板),然后将以下代码添加到main.py文件中:

from bottle import route, run, template, get, static_file # connecting the framework and the necessary components
@route('/') # setting up routing for requests for /
def index():return template('index.tpl')  # showing template in response to requestrun(host="localhost", port=8080)  # running the application on port 8080

当我们启动应用程序时,会在 http://localhost:8080 上看到一个空白页面。由于文档服务器无法从头开始创建新文档,因此我们必须添加默认文件并在模板中形成其名称列表。因此,我们创建一个文件夹 files ,并在其中放入 3 个文件(docx、xlsx 和 pptx)。

我们将使用 listdir 组件来读取它们的名称。

from os import listdir

现在让我们为 files 文件夹中的所有文件名创建一个变量:

sample_files = [f for f in listdir('files')]

要在模板中使用此变量,我们需要通过template方法传递它:

def index():return template('index.tpl', sample_files=sample_files)

让我们在模板中显示这个变量:

%for file in sample_files:<div><span>{{file}}</span></div>
% end

重新启动应用程序后,我们可以在页面上看到文件名列表。现在我们必须使所有应用程序用户都可以使用这些文件。

这是一种新方法:

@get("/files/<filepath:re:.*\.*>")
def show_sample_files(filepath):return static_file(filepath, root="files")

在 Python 应用程序中查看文档

使用 ONLYOFFICE 编辑器安装文档服务器。有很多安装选项,但我们建议使用 Docker:

docker run -itd -p 80:80 onlyoffice/documentserver-de

连接模板中的文档编辑器 API:

<script type="text/javascript" src="editor_url/web-apps/apps/api/documents/api.js"></script>

editor_url 是文档编辑器的链接。

一个按钮用于打开每个文件进行查看

<button onclick="view('files/{{file}}')">view</button>

现在我们需要添加一个带有 id 的 div:

<div id="editor"></div>

文档编辑器将在此 div 中打开。但只有在我们调用将打开编辑器的函数之后才行。

<script>
function view(filename) {if (/docx$/.exec(filename)) {filetype = "text"}if (/xlsx$/.exec(filename)) {filetype = "spreadsheet"}if (/pptx$/.exec(filename)) {filetype = "presentation",title: filename}new DocsAPI.DocEditor("editor",{documentType: filetype,document: {url: "host_url" + '/' + filename,title: filename},editorConfig: {mode: 'view'}});}
</script>

DocEditor 函数有两个参数:将打开编辑器的元素的 id 和包含编辑器设置的 JSON。

所有参数都可以在官方API文档中找到。在此示例中,我们使用强制参数 documentType 、 document.url 和 editorConfig.mode 。我们还添加标题 - 这是将在编辑器中显示的文件名。

文档类型 (documentType) 将通过其格式进行标识(docx 表示文本,xlsx 表示电子表格,pptx 表示演示文稿)。

注意 document.url。这是我们要打开的文件的链接。

现在,我们已经做好了在 Python 应用程序中查看文档的准备

编辑文件

让我们添加“编辑”按钮:

<button onclick="edit('files/{{file}}')">edit</button>

现在我们需要创建一个新函数来打开文件进行编辑。它类似于 View 函数,所以让我们将普通部分作为一个单独的函数。

现在我们有3个函数:

<script>var editor;function view(filename) {if (editor) {editor.destroyEditor()}editor = new DocsAPI.DocEditor("editor",{documentType: get_file_type(filename),document: {url: "host_url" + '/' + filename,title: filename},editorConfig: {mode: 'view'}});}function edit(filename) {if (editor) {editor.destroyEditor()}editor = new DocsAPI.DocEditor("editor",{documentType: get_file_type(filename),document: {url: "host_url" + '/' + filename,title: filename}});}function get_file_type(filename) {if (/docx$/.exec(filename)) {return "text"}if (/xlsx$/.exec(filename)) {return "spreadsheet"}if (/pptx$/.exec(filename)) {return "presentation"}}
</script>

destroyEditor 将关闭已打开编辑器

默认情况下, editorConfig 参数的值为 {"mode": "edit"} ,这就是 edit() 函数中缺少它的原因。

现在将打开文件进行编辑。

编辑文档

同编辑是通过在编辑器设置中对同一文档使用相同的 document.key 来实现的。如果没有此密钥,编辑器将在您每次打开文件时创建编辑会话。

为了使用户连接到同一编辑会话进行共同编辑,我们需要为每个文档设置唯一的密钥。让我们使用文件名+“_key”格式的密钥。我们需要将其添加到存在document的所有配置中。

 document: {url: "host_url" + '/' + filepath,title: filename,key: filename + '_key'},

保存文件

ONLYOFFICE 通常会存储您在其中工作时对文档所做的所有更改。关闭编辑器后,Document Server 构建要保存的文件版本并将请求发送到callbackUrl 地址。该请求包含 document.key 和刚刚构建的文件的链接。

在生中,您将使用 document.key 查找文件的旧版本并将其替换为新版本。在我们的例子中,我们没有任何数据库,所以我们只是使用callbackUrl 发送文件名。

在editorConfig.callbackUrl的设置中指定callbackUrl。添加此参数后,edit()方法将如下所示:

function edit(filename) {const filepath = 'files/' + filename;if (editor) {editor.destroyEditor()}editor = new DocsAPI.DocEditor("editor",{documentType: get_file_type(filepath),document: {url: "host_url" + '/' + filepath,title: filename, key: filename + '_key'},editorConfig: {mode: 'edit',callbackUrl: "host_url" + '/callback' + '&filename=' + filename  // add file name as a request parameter}});}

现在我们需要编写一个方法,在将 post 请求发送到 /callback 地址后保存文件:

@post("/callback") # processing post requests for /callback
def callback():if request.json['status'] == 2:file = requests.get(request.json['url']).contentwith open('files/' + request.query['filename'], 'wb') as f:f.write(file)return "{\"error\":0}"

# status 2 是构建的文件。有关所有状态的更多信息可以在 API 文档中找到。

现在,关闭编辑器后,文件的新版本将保存到存储中。

管理用户

如果您的应用程序中有用户,请将他们的标识符(id 和名称)写入编辑器的配置中。这样您就可以看到到底是谁在编辑文档。

作为示例,让我们添加在界面中选择用户的功能:

<select id="user_selector" onchange="pick_user()"><option value="1" selected="selected">JD</option><option value="2">Turk</option><option value="3">Elliot</option><option value="4">Carla</option>
</select>

让我们在标签 <script> 的开头添加函数 pick_user() 的调用。在函数本身中,我们将初始化负责 id 和用户名的变量。

function pick_user() {const user_selector = document.getElementById("user_selector");this.current_user_name = user_selector.options[user_selector.selectedIndex].text;this.current_user_id = user_selector.options[user_selector.selectedIndex].value;}

现在我们需要使用 editorConfig.user.id 和 editorConfig.user.name 在编辑器配置中添加用户设置。让我们将这些参数添加到文件编辑功能中的编辑器配置中。

function edit(filename) {const filepath = 'files/' + filename;if (editor) {editor.destroyEditor()}editor = new DocsAPI.DocEditor("editor",{documentType: get_file_type(filepath),document: {url: "host_url" + '/' + filepath,title: filename},editorConfig: {mode: 'edit',callbackUrl: "host_url" + '/callback' + '?filename=' + filename,user: {id: this.current_user_id,name: this.current_user_name}}});}

我们希望这个简单的示例能够帮助您将 ONLYOFFICE 与 Python 应用程序集成。更多集成示例可以在 GitHub上找到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/163411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【分享】Java Builder 建造者模式之案例分享

介绍 建造者模式&#xff08;Builder&#xff09;核心目的是通过使用多个简单对象一步步构建出一个复杂对象。通过将复杂对象的构造过程拆分为多个简单的步骤&#xff0c;使得创建对象更加灵活&#xff0c;可读性和可维护性更强。 使用场景 创建一个由多个部分组成的复杂对象…

这样写Allure生成测试报告,学会直接涨薪5k

Allure是一个开源的测试报告生成框架&#xff0c;提供了测试报告定制化功能&#xff0c;相较于我们之前使用过pytest-html插件生成的html格式的测试报告&#xff0c;通过Allure生成的报告更加规范、清晰、美观。 pytest框架支持使用Allure生成测试报告&#xff0c;接下来让介绍…

SpringBoot整合knife4j生成Api文档

一、介绍 先看效果 ①&#xff1a;Swagger 介绍 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/)。 它的主要作用是&#xff1a; 使得前后端分离开发更加方便&#xff0c;有利于团队协作 接口的文档…

Doris-集群部署(四)

创建目录并拷贝编译后的文件 1&#xff09;创建目录并拷贝编译后的文件 mkdir /opt/module/apache-doris-0.15.0 cp -r /opt/software/apache-doris-0.15.0-incubating-src/output /opt/module/apache-doris-0.15.02&#xff09;修改可打开文件数&#xff08;每个节点&#x…

oracle数据库巡检常见脚本-系列三

简介 作为数据库管理员&#xff08;DBA&#xff09;&#xff0c;定期进行数据库的日常巡检是非常重要的。以下是一些原因&#xff1a; 保证系统的稳定性&#xff1a;通过定期巡检&#xff0c;DBA可以发现并及时解决可能导致系统不稳定的问题&#xff0c;如性能瓶颈、资源利用率…

TIDB基础

TIDB整个逻辑架构跟MYSQL类似&#xff0c;如下&#xff1a; TIDB集群&#xff1a;相当于MYSQL的数据库服务器&#xff0c;区别是MYSQL数据库服务器为单进程的&#xff0c;TIDB集群为分布式多进程的。 数据库&#xff1a;同MYSQL数据库&#xff0c;数据库属于集群&#xff0c;…

VM CentOS7安装ffmpeg

项目中涉及给视频添加水印&#xff0c;使用到了ffmpeg&#xff0c;windows系统可直接使用&#xff0c;Linux需要手动编译完成ffmpeg后才可正常使用。 配置yum源: 备份原repo文件 cd /etc/yum.repos.d/mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.r…

编写自己的CA和TA与逆向

参考内容《手机安全和可信应用开发》 https://note.youdao.com/s/MTlG4c1w 介绍 TA的全称是Trust Application&#xff0c; 即可信任应用程序。 CA的全称是Client Applicant&#xff0c; 即客户端应用程序。 TA运行在OP-TEE的用户空间&#xff0c; CA运行在REE侧。 CA执行时代…

前端 Ajax 技术有哪些优缺点?

Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种基于前端 JavaScript 技术的异步通信技术&#xff0c;可以在不刷新整个页面的情况下向服务器发送请求和接收响应&#xff0c;以实现动态加载内容和交互效果。下面是 Ajax 技术的优缺点&#xff1a; 优点&am…

css实现三行,溢出显示省略号(后有js实现逻辑)

css实现代码&#xff1a; .text-container {display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 3;overflow: hidden;text-overflow: ellipsis; }解释&#xff1a; 1.-webkit-box 和 -webkit-box-orient 属性将容器元素设置为一个垂直方向的弹性盒子&…

需求调研计划及用户需求调研单

1.目的 2.概述 3.需求调研计划 3.1调研目的 3.2调研范围 3.2.1.调研的职能范围 3.2.2.调研的业务范围 3.2.3.调研的地点范围 3.3调研方式 3.4调研阶段 3.5具体时间安排 软件开发全文档获取&#xff1a;点我获取 1、需求调研计划 2、用户需求调研单 项目名称 客…

C++ auto的作用

auto的作用 保护变量的值不被修改&#xff0c;防止意外的错误操作&#xff1b;声明函数参数为常量引用&#xff0c;以避免函数修改参数的值&#xff1b;声明类的成员函数为常量成员函数&#xff0c;以确保函数不修改对象的状态。 1 const关键字用于声明一个常量&#xff0c;…

【EI会议投稿】第九届电子技术和信息科学国际学术会议(ICETIS 2024)

第九届电子技术和信息科学国际学术会议&#xff08;ICETIS 2024&#xff09; The 9th International Conference on Electronic Technology andInformation Science&#xff08;ICETIS 2024&#xff09; ICETIS会议始于2016年&#xff0c;先后吸引众多来自国内外高等院校、科…

2023亚太杯数学建模竞赛C题新能源电动汽车数据分析与代码讲解

C题论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解、问题4模型的建立和求解、问题5模型的建立和求解&#xff09;、模型的评价等等&#xff0c; 视频讲解如下&…

组件库篇 | EUI | 按钮

组件库篇 | EUI | 按钮 前言 从本章开始,我将会一一演示所有组件所有函数的调用代码,以方便读者掌握组件的具体用法。但这并不意味着在实际使用中要用到所有的函数,请读者按需取用。 基本介绍 EUI提供了三种类型的按钮,如下: 常规按钮 Button文字按钮 TextButton图标按钮…

《洛谷深入浅出基础篇》P1113 杂物——DAG

上链接&#xff1a;P1113 杂务 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1113 上题干&#xff1a; 题目描述 John 的农场在给奶牛挤奶前有很多杂务要完成&#xff0c;每一项杂务都需要一定的时间来完成它。比如&#xff1a;他们要将奶牛…

编写SQL语句,场景:从一张表中查询某字段是逗号分隔的集合值,需要遍历集合内每个值,将其作为条件去查询另一张表,最终返回列表

目录 场景编写SQL分页获取该开票单号下的所有订单列表使用子查询和 in 字句使用 find_in_set 场景 从一张表中查询某字段是逗号分隔的集合值&#xff0c;需要遍历集合内每个值&#xff0c;将其作为条件去查询另一张表&#xff0c;最终返回列表 编写SQL 分页获取该开票单号下…

羊大师详解羊奶如何帮助控制血压

羊大师详解羊奶如何帮助控制血压 羊奶是一种珍贵的天然饮品&#xff0c;不仅具有丰富的营养成分&#xff0c;还被证实对血压具有调控作用。很多人在了解到羊奶的功效后&#xff0c;都对其与血压之间的关系产生了浓厚的兴趣。接下来&#xff0c;小编羊大师将为大家详细介绍羊奶…

Linux基本命令与系统题目

1.linux 2.6.* 内核默认支持的文件系统有哪些&#xff1f;[多选] A.ext3 B.ext2 C.ext4 D.xfs E.ufs 2.linux查看cpu占用的命令是什么&#xff1f; A.top B.netstat C.free D.df 3.在Linux系统中, 为找到文件try_grep含有以a字母为行开头的内容, 可以使用命令&…