如何將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.pswp.cn/news/163411.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163411.shtml
英文地址,請注明出處:http://en.pswp.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字母為行開頭的內容, 可以使用命令&…