OxOffice Online 技術手冊

提供 OxOffice Online 在安裝、設定、整合及佈署的相關文件說明。

OxOffice Online 主程式安裝說明

本文件將說明如何從無到有重新安裝 OxOOL(OxOffice Online) 應用,建議熟悉 CentOS 7 系統指令的朋友可以選擇 Minimal 的版本來安裝;熟悉 Ubuntu 18.04 的朋友可以選擇 Server 版來安裝。從安裝到啟動服務,網路快的話大約在 15 分鐘左右就搞定了。 如果沒有安裝過 NextCloud 的朋友,也可以參考文件下半部的 NextCloud 安裝說明,在同一台安裝來測試玩看看。 本文件是採用 CentOS 7 及 Ubuntu 18.04 版本進行安裝展示,其它版本的系統尚未經過測試,不過若有興趣的朋友可以至 GitHub 下載最新的原始碼進行編譯。

OxOffice Online 主程式安裝說明

在 CentOS 7 環境下安裝(社群版)

建議請記得設定成固定 IP,可參考上述安裝文件
yum update -y
yum install vim net-tools unzip wget -y
cd /etc/yum.repos.d
wget --no-check-certificate https://demo.oxoffice.com.tw/yum.repo/oxool-community.repo
yum update -y
yum groupinstall "OxOOL Community Group" -y
vim /etc/selinux/config # vim 可代換成任何您慣用的文字編輯器
# 尋找 SELinux=enforcing 此行並將 enforcing 改為 disabled 或 permissive 並存檔離開
firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --zone=public --permanent --add-port=9980/tcp
systemctl enable oxool
reboot
netstat -tlnp

結果如下:

tcp      0    0    127.0.0.1:9981	  0.0.0.0:*	LISTEN   644/xoolwsd
tcp6     0    0    :::9980		      :::*   	LISTEN   644/oxoolwsd

如果出現以上的結果,代表架設成功囉!

OxOffice Online 主程式安裝說明

在 Ubuntu 18.04 環境下安裝(社群版)

建議設定成固定 IP,可參考上述安裝文件 [3]
sudo apt install vim openssh-server net-tools curl -y
sudo apt update
sudo apt upgrade -y
如果有重新啟動服務的提示,請選擇 yes 即可

curl http://free.nchc.org.tw/ezgo-core/ezgo.gpg.key | sudo apt-key add
echo "deb [arch=amd64] http://free.nchc.org.tw/ezgo-core/ oxool8 main" > ~/oxool.list
echo "deb-src http://free.nchc.org.tw/ezgo-core/ oxool8 main" >> ~/oxool.list
sudo mv ~/oxool.list /etc/apt/sources.list.d/
sudo apt update
sudo apt install oxool -y
sudo systemctl enable oxool
sudo reboot
netstat -tlnp

結果如下:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:9981          0.0.0.0:*               LISTEN      22383/oxool         
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      6523/systemd-resolv 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      4389/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      2575/master         
tcp6       0      0 :::9980                 :::*                    LISTEN      22383/oxool         
tcp6       0      0 :::22                   :::*                    LISTEN      4389/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      2575/master

上述流程感謝 ezgo 團隊的 Franklin 協助提供~

OxOffice Online 主程式安裝說明

在 CentOS 7 PVE LXC 環境下安裝(社群版)

image-1592291177864.png

image-1592291421110.png

image-1592291560250.png

yum install vim openssh* net-tools unzip wget -y
cd /etc/yum.repos.d
wget --no-check-certificate https://demo.oxoffice.com.tw/yum.repo/oxool-community.repo
yum update -y
yum groupinstall "OxOOL Community Group" -y
systemctl enable oxool
reboot
netstat -tlnp

結果如下:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:9981          0.0.0.0:*               LISTEN      1049/oxool          
tcp6       0      0 :::9980                 :::*                    LISTEN      1049/oxool  
OxOffice Online 主程式安裝說明

在 Ubuntu 18.04 PVE LXC 環境下安裝(社群版)

image-1592292782630.png

image-1592292882270.png

image-1592292961445.png

apt update
apt install vim openssh* net-tools curl locales-all gnupg python3-uno -y
#如果過程中有重新啟動服務的提示,請選擇 yes 即可
apt upgrade -y
curl https://ezgo.goodhorse.idv.tw/apt/ezgo/ezgo.gpg.key | sudo apt-key add
echo "deb [arch=amd64] http://free.nchc.org.tw/ezgo-core/ oxool8 main" > ~/oxool.list
echo "deb-src http://free.nchc.org.tw/ezgo-core/ oxool8 main" >> ~/oxool.list
mv ~/oxool.list /etc/apt/sources.list.d/
apt update
apt install oxool -y
systemctl enable oxool
reboot
netstat -tlnp

結果如下:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:9981          0.0.0.0:*               LISTEN      22383/oxool         
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      6523/systemd-resolv 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      4389/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      2575/master         
tcp6       0      0 :::9980                 :::*                    LISTEN      22383/oxool         
tcp6       0      0 :::22                   :::*                    LISTEN      4389/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      2575/master    

OxOffice Online 佈署設定

與 OxOffice Online 佈署及設定相關內容

OxOffice Online 佈署設定

設定啟用 OxOOL SSL 憑證

若要設定 OxOOL 服務的主機運作在 SSL 協定上時,請確認已經有申請到正式的 hostname,接下來透過以下設定方式啟動 SSL:

<ssl desc="SSL settings">
    <enable type="bool" desc="Controls whether SSL encryption is enable (do not disable for production deployment). If default is false, must first be compiled with SSL support to enable." default="true">true</enable>
    <termination desc="Connection via proxy where oxoolwsd acts as working via https, but actually uses http." type="bool" default="true">false</termination>
    <cert_file_path desc="Path to the cert file" relative="false">/etc/oxool/ssl/certificate.crt</cert_file_path>
    <key_file_path desc="Path to the key file" relative="false">/etc/oxool/ssl/private.key</key_file_path>
    <ca_file_path desc="Path to the ca file" relative="false">/etc/oxool/ssl/ca_bundle.crt</ca_file_path>
    <cipher_list desc="List of OpenSSL ciphers to accept" default="ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"></cipher_list>
    <hpkp desc="Enable HTTP Public key pinning" enable="false" report_only="false">
        <max_age desc="HPKP's max-age directive - time in seconds browser should remember the pins" enable="true">1000</max_age>
        <report_uri desc="HPKP's report-uri directive - pin validation failure are reported at this URL" enable="false"></report_uri>
        <pins desc="Base64 encoded SPKI fingerprints of keys to be pinned">
        <pin></pin>
        </pins>
    </hpkp>
</ssl>
# systemctl restart oxool
https://yourhostname:9980
  1. 在設定 richdocument 的位置時,建議使用 FQDN 而不是 IP。
  2. 如果 NextCloud / OwnCloud 及 OxOOL 的 SSL 模式都設定正常但 OxOOL 仍無法正確開啟時,請將 ca_bundle.crt 的檔案 copy 到 NextCloud 主程式目錄路行,並取代以檔案【ca-bundle.crt】(記得檔案名稱不要改),應該就可以正常開啟。
[nextcloud主程式目錄]/resources/config/ca-bundle.crt
OxOffice Online 佈署設定

設定讓其它的 NextCloud 來存取 OxOOL

在撰寫說明文件的過程中,demo 環境都是設定在「內網 IP 環境」中,若您的佈署的環境開以下二種情境者,需額外進行進階的設定,二種情境如下:

<wopi desc="Allow/deny wopi storage. Mutually exclusive with webdav." allow="true">
<host desc="Regex pattern of hostname to allow or deny." allow="true">localhost</host>
<host desc="Regex pattern of hostname to allow or deny."
allow="true">10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}</host>
<host desc="Regex pattern of hostname to allow or deny."
allow="true">172\.1[6789]\.[0-9]{1,3}\.[0-9]{1,3}</host>
<host desc="Regex pattern of hostname to allow or deny." allow="true">172\.2[0-9]\.[0-9]{1,3}\.[0-9]{1,3}</host>
<host desc="Regex pattern of hostname to allow or deny." allow="true">172\.3[01]\.[0-9]{1,3}\.[0-9]{1,3}</host>
<host desc="Regex pattern of hostname to allow or deny." allow="true">192\.168\.[0-9]{1,3}\.[0-9]{1,3}</host>
<host desc="Regex pattern of hostname to allow or deny." allow="true">117\.56\.68\.133</host>
<host desc="Regex pattern of hostname to allow or deny." allow="true">odf\.nat\.gov\.tw</host>
<host desc="Regex pattern of hostname to allow or deny." allow="false">192\.168\.1\.1</host>
<max_file_size desc="Maximum document size in bytes to load. 0 for unlimited." type="uint">0</max_file_size>
</wopi>
<host desc="Regex pattern of hostname to allow or deny." allow="true">117\.56\.68\.133</host>
<host desc="Regex pattern of hostname to allow or deny." allow="true">odf\.nat\.gov\.tw</host>
# systemctl restart oxool

NextCloud 安裝

NextCloud 是可與 OxOffice Online 搭配使用的開源線上檔案儲存空間方案,目前開源版本建議可以下載 NextCloud 16 的版本來測試,如果對 17、18 版本有興趣的朋友,也可以下載安裝試試~

NextCloud 安裝

在 CentOS 7 下安裝 NextCloud 16

請先下載、安裝 CentOS 7 最新版本(最新版本:2003 載點 MinimalDesktop)– 安裝 CentOS 可參考文件 [1] [2] [3]。

rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi-php72.repo
yum install php php-mysql php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-intl php-zip curl -y
systemctl enable httpd
systemctl restart httpd
cd /var/www/html
wget --no-check-certificate https://download.nextcloud.com/server/releases/nextcloud-16.0.9.zip
unzip nextcloud-16.0.9.zip
chown apache.apache nextcloud -R
cd /var/www/html
wget --no-check-certificate https://github.com/nextcloud/richdocuments/releases/download/v3.5.2/richdocuments.tar.gz
tar zxvf richdocuments.tar.gz -C /var/www/html/nextcloud/apps/
chown apache.apache nextcloud -R

接著請以管理者身份登入 NextCloud:

cd /var/www/html/nextcloud
sudo -u apache php occ config:app:set richdocuments wopi_url --value="http://yourhostip:9980"

OxOffice Online(OxOOL)編譯說明

如果想編譯在 github 上最新版本的 OxOOL 社群版本,請參考本文件說明該如何建立 OxOffice Online(OxOOL) 編譯環境及編譯流程。

OxOffice Online(OxOOL)編譯說明

在 CentOS 7 環境下編譯 OxOOL

參考到設定 firewall 的部份,重新開機就行。
yum install epel-release -y
yum update -y
yum install git yum-utils libpcap libcap-devel poco-devel ccache python-pip -y
pip install wheel
pip install polib
yum-builddep libreoffice -y
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.0/install.sh | bash
exit -> 離開 terminal 重新登入
nvm install node
exit -> 離開 terminal 重新登入
git clone https://github.com/OSSII/oxool-community.git
cd oxool-community
./autogen.sh
./configure
make dist
rpmbuild -tb oxool-x.x.x.tar.gz #在做完以上步驟後,clone 下來的目錄內應會有一個檔名類似 oxool-3.2.11.tar.gz 的壓縮檔,將後面的 oxool-x.x.x.tar.gz 代換為此檔的檔名即可
~/rpmbuild/RPMS/x86_64

套件直接就可以拿來安裝~編譯完成。

OxOffice Online(OxOOL)編譯說明

在 Ubuntu 18.04 環境下編譯 OxOOL

建議使用 Destktop 版本做為編譯基礎環境。
sudo systemctl stop oxool
sudo systemctl disable oxool
sudo apt install git -y
git clone https://github.com/OSSII/oxool-community.git
cd oxool-community
./install_build_require_ubuntu.sh

執行:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash

執行以下二行指令,第一行:

export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"

第二行:

[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

安裝 nvm

nvm install node

切換到 oxool-cummunity 程式的主目錄下,開始編譯程式。

./autogen.sh # 過程中若是提示找不到 fontconfig,請安裝 libfontconfig-dev;若提示缺少 Poco 標頭,則請安裝 libpoco-dev
make -j2

如果成功就會看到以下訊息請您輸入編譯帳號的密碼:

[sudo] password for oxoffice:

輸入後,會繼續編譯直到完成,然後輸入以下指令測試是否能運行成功:

make run

如果看到以下訊息,就代表已經可以成功測試了。

Ready to accept connections on port 9980.

我們使用的打包工具 debhelper 會在打包時啟用 fakeroot 環境,所以環境的執行檔會以 root 為主,因此請根據以下的教學將 npm & node 的執行路徑新增至 「/usn/bin」,請先執行以下指令:

whereis npm

會得到類似 /home/oxoffice/.nvm/versions/node/v14.3.0/bin/npm 的結果
請將以下的 /home/oxoffice/.nvm/versions/node/v14.3.0/bin/npm 取代為你自己環境的路徑,指令如下:

sudo ln -s /home/oxoffice/.nvm/versions/node/v14.3.0/bin/* /usr/bin/

接下來請在專案的根目錄執行

debuild -b -uc -us # 若您已先執行過上面的編譯動作,在執行此步驟前請先在您的 oxool-community 目錄執行 git clean -fdx 指令,如此才能正常打包

最後打包的 deb 結果會生成在專案的上層目錄

cd ..
ls oxool_3.x.x-1.community_amd64.deb

套件直接就可以拿來安裝~編譯完成。

OxOffice Online 模組開發

如何透過 OxOffice Online Module SDK 來開發自有的 Module

OxOffice Online 模組開發

如何體驗 OxOOL Module?

取得 SDK 的方法

1. 自行編譯 oxool-community 並打包,可以取得 oxool-devel RPM 包

2. 至 GitHub 下載最新版本的 oxool-devel RPM

取得以後請輸入(請自行替換後面的版號)

sudo yum localinstall -y oxool-devel-xx.xxx.rpm

編譯/打包本專案

請先閱讀上面的技術手冊了解取得 oxool-devel 的方法

本地端編譯與測試開發

./autogen.sh

./configure --enable-debug

make -j4

cp src/.libs/libtest.so.0.0.0 PATH_TO_oxool-community/libtest.so

打包

./autogen.sh

./configure

make dist

rpmbuild -ta oxool-module-sample-1.0.0.tar.gz

測試本專案

需搭配 oxool-community 才能掛載此模組並進行 API 測試

執行 oxool-community 以後打開 http://your_ip:9980/loleaflet/dist/admin/sample,並輸入帳密 admin/admin 可以看到這個頁面。

sample_demo_page.PNG

 

接下來請依照下列順序

  1. 選擇一個 ODT 檔案
  2. 修改「插入文字」欄位
  3. 點選開始測試

快速建構一個自己的模組專案

請執行下面指令並輸入新的模組名稱

./create_your_module.sh

執行完後,新的專案會建立於上層目錄。

 

OxOffice Online 模組開發

介紹 SDK & Sample Module

模組 SDK 介紹

要寫一個新的模組需要繼承 oxool-devel 的類別 oxoolmodule

並至少要將 handleRequest 實作出來

另外還有幾個延伸功能的選擇性實作

以 Sample Module 為範例來瞭解 SDK 的概念

 

handleRequest(需要實作)

技術要點

  1. 模組處理 request 時需要 fork
  2. URL 第二個路徑為模組的名稱
void sample::handleRequest(std::weak_ptr<StreamSocket> _socket,
                           MemoryInputStream &message,
                           HTTPRequest &request,
                           SocketDisposition &disposition)
{
    Poco::URI requestUri(request.getURI());
    std::vector<std::string> reqPathSegs;
    requestUri.getPathSegments(reqPathSegs);
    std::string method = request.getMethod();
    Process::PID pid = fork();
    if (pid < 0)
    {
        quickHttpRes(_socket,
                     HTTPResponse::HTTP_SERVICE_UNAVAILABLE);
    }
    else if (pid == 0)
    {
        // This would trigger this fork exit after the socket finish write
        // note: exit point is in wsd/LOOLWSD.cpp where ClientRequestDispatcher (SocketHandler)'s performWrites()
        try
        {
            Poco::URI requestUri(request.getURI());
            std::vector<std::string> reqPathSegs;
            requestUri.getPathSegments(reqPathSegs);
            std::string method = request.getMethod();
            if (request.getMethod() == HTTPRequest::HTTP_GET && reqPathSegs.size() == 2)
            {
                quickHttpRes(_socket, HTTPResponse::HTTP_OK);
            }
            else if (request.getMethod() == HTTPRequest::HTTP_POST &&
                     reqPathSegs[1] == "sample")
            { // /lool/sample
                handlesample(_socket, request, message, disposition);
            }
            else
            {
                quickHttpRes(_socket, HTTPResponse::HTTP_NOT_FOUND);
            }
        }
        catch (std::exception &e)
        {
            std::cout << e.what() << "\n";
            logger().notice("[Exception]" + std::string(e.what()));
            quickHttpRes(_socket, HTTPResponse::HTTP_INTERNAL_SERVER_ERROR);
        }

        exit_application = true;
    }
    else
    {
        std::cout << "call from parent" << std::endl;
    }
}

 

handleAdmin: 控管後端管理介面(選擇性實作)

技術要點

  1. handleAdmin 會接到來自 WebSocket 解析過後的一串指令
  2. 指令的結構為: <modulename> <action> <data in this format: x,y,z ....>
  3. 這裡的範例是透過管理介面來管理模組的設定檔
std::string sample::handleAdmin(std::string command)
{
    /*
     *command format: module <modulename> <action> <data in this format: x,y,z ....>
     */
    auto tokenOpts = StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM;
    StringTokenizer tokens(command, " ", tokenOpts);
    std::string result = "Module Loss return";
    std::string action = tokens[2];

    // 以 json 字串傳回 sample.xml 
    if (action == "getConfig" && tokens.count() >= 4)
    {
        std::ostringstream oss;
        oss << "settings {\n";
        for (size_t i = 3; i < tokens.count(); i++)
        {
            std::string key = tokens[i];

            if (i > 3)
                oss << ",\n";

            oss << "\"" << key << "\": ";
            // 下列三種 key 是陣列形式

            if (xml_config->has(key))
            {
                std::string p_value = addSlashes(xml_config->getString(key, "")); // 讀取 value, 沒有的話預設為空字串
                std::string p_type = xml_config->getString(key + "[@type]", "");  // 讀取 type, 沒有的話預設為空字串
                if (p_type == "int" || p_type == "uint" || p_type == "bool" ||
                    p_value == "true" || p_value == "false")
                    oss << p_value;
                else
                    oss << "\"" << p_value << "\"";
            }
            else
            {
                oss << "null";
            }
        }
        oss << "\n}\n";
        result = oss.str();
    }
    else if (action == "setConfig" && tokens.count() > 1)
    {
        Poco::JSON::Object::Ptr object;
        if (JsonUtil::parseJSON(command, object))
        {
            for (Poco::JSON::Object::ConstIterator it = object->begin(); it != object->end(); ++it)
            {
                // it->first : key, it->second.toString() : value
                xml_config->setString(it->first, it->second.toString());
            }
            xml_config->save(ConfigFile);
            result = "setConfigOk";
        }
        else
        {
            result = "setConfigNothing";
        }
    }
    else
        result = "No such command for module " + tokens[1];

    return result;
}

getHTML: 返回後端管理頁面的 static resource(選擇性實作)

技術要點

  1. 基本上 getHTML 無須改動
  2. 解析在專案的靜態資源目錄 /<path-to-module>/html/ 的路徑
  3. 詳細的路徑引用請參閱 GitHub/oxool-module-sample 的 admin.html (可以看下一個小節)
std::string sample::getHTMLFile(std::string fileName)
{
    std::string filePath = "";
#ifdef DEV_DIR
    std::string dev_path(DEV_DIR);
    filePath = dev_path + "/html/";
#else
    filePath = "/var/lib/oxool/sample/html/";
#endif
    filePath += fileName;
    return filePath;
}

admin.html: 後端管理頁面範例與解說

技術要點

  1. oxool-community 採用了模板引擎,目前僅支援 {% BLOCK content %} ...TODO... {% END BLOCK %}
  2. 在 script 的 src 的結構須為: <module-name>/<path-in-module's-html>/<filename>

 

{% BLOCK content %}
<script src="sample/js/AdminSocketConfigSettings.js"> </script>
<script>
    if (window.location.protocol == "https:") {
        host = 'wss://' + window.location.host + '%SERVICE_ROOT%/lool/adminws/'
    }
    else {
        host = 'ws://' + window.location.host + '%SERVICE_ROOT%/lool/adminws/'
    }

    var configSocket = Admin.ConfigSettings(host);
</script>

<ul class="nav nav-tabs">
    <li role="presentation" class="active"><a data-toggle="tab" href="#a1" class="tabctl">API 測試</a></li>
    <li role="presentation" class=""><a data-toggle="tab" href="#a2" class="tabctl">設定檔管理</a></li>
    <li role="presentation" class=""><a data-toggle="tab" href="#a3" class="tabctl">版權聲明</a></li>
</ul>
<div class="tab-content" style="height: 100%;">
    ...
    <!--******************************版權聲明******************************-->
    <div id="a3" class="tab-pane" style="width: 100%; padding-top:10px;">
        <pre id="license" class="panel-body" style="border: 0; background-color: transparent;">
        </pre>
    </div>
</div>

<script>
    var getCookie = function (name) {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = cookies[i].trim();
            if (cookie.indexOf(name) === 0) {
                return cookie;
            }
        }
        return '';
    }
    
</script>
{% END BLOCK %}
OxOffice Online 模組開發

Module 功能開發 --- 錄製巨集與製作插件

擴充 Module 功能

模組功能開發的主要功能實作可以自由選擇以下但不限

  1. LibreOffice/OxOffice Extension
  2. uno command
  3. python script

此章節我們要以 LibreOffice/OxOffice Extension 來介紹如何快速透過擴充插件來擴充模組的功能

LibreOffice/OxOffice Extension

寫 Extension 有兩種方法,這邊會延伸介紹第二種方法
  1. 熟悉 VBA 並稍微熟悉 LibreOffice 的 StarBasic 即可自由撰寫
  2. 使用 LibreOffice 內建的【錄製巨集】來快速開發
▶如何錄製巨集?

首先啟用錄製巨集的功能,如下圖

record-macro.PNG

然後打開 Writer 文件,並於【工具 > 巨集 > 錄製巨集】來啟動錄製功能,如下圖

record-macro_2.PNG

錄製過程請操作自己想操作的功能,並將錄製結果儲存起來,並透過編輯巨集來看錄製的成果。

record-macro_3.PNG

record-macro_4.PNG

record-macro_5.PNGrecord-macro_6.PNG

record-macro_7.PNG

 

▶如何製作 Extension?

首先打開 LibreOffice 的【工具 > 巨集 > 組織巨集  > LibreOffice Basic】

LO_create_extension.png

下一步點選:【統籌概覽 > 選函示庫 > 選擇要輸出成擴充套件的函示庫 > 確定】

LO_create_extension_2.png

LO_create_extension_3.png

LO_create_extension_4.png

 

 

OxOffice Online 模組開發

Module 功能開發 --- Uno Command

擴充 Module 功能

模組功能開發的主要功能實作可以自由選擇以下但不限

  1. LibreOffice/OxOffice Extension
  2. uno command
  3. python script

此章節我們要以 Uno Command 來介紹如何快速透過擴充插件來擴充模組的功能

Uno 是什麼?

這邊可以看看維基百科

Uno Command 是什麼?

簡言之,UnoCommand 是 LibreOffice 內部實作的功能,並且都有其對應的函數與參數。

詳細的 UnoCommand 可以參考官方文件看看有那些 UnoCommand 可以使用。

如何透過 C++ 來執行 UnoCommand 來擴充模組功能

 

LibreOfficeKit 提供開發者透過 postUnoCommand 直接使用 UNO Service,如下方所示的範例程式碼就是

 

//Using UnoCommand also can do the insertText
std::string json = R"MULTILINE(
        {
            "Text":
            {
                "type":"string",
                "value":"%s"
            }
        }
    )MULTILINE";
std::string args_str = Poco::format(json, msg);

lodoc->postUnoCommand(".uno:InsertText", args_str.c_str(), true);

 

OxOffice Online 模組開發

Module 功能開發 --- python

擴充 Module 功能

模組功能開發的主要功能實作可以自由選擇以下但不限

  1. LibreOffice/OxOffice Extension
  2. uno command
  3. python script

此章節需要有 python 的先備知識,相信朋友們會點進來的都有 python 的基礎囉!

接下來我們會介紹 Python 在 LibreOffice 的架構與在模組的應用開發