LibreOffice

LibreOffice - 自由自在地辦公, 高效永續地執行內容管理.


經常可以在網路上看到警告中小企業公司不要使用盜版軟體的廣告, 其實這些貓捉老鼠的戲碼, 對於 Ubuntu Desktop 與 LibreOffice 的用戶而言, 只能大笑三聲, 因為老鼠有時候是壞貓養出來的, 而且二十一世紀的現代貓, 早就已經沒有能力捉壞老鼠了:-)

敬告各位中小企業公司的老闆們, 在建構各式內容管理系統時, 可以考慮桌面操作系統使用 Ubuntu Desktop, 近端伺服器採用 Ubuntu Server, CentOS, Fedora 或 OpenSuse, 而遠端伺服器採用 OpenShift, 不僅可以順利完成原先利用 MS Windows 與 Office 能完成的任何工作, 而且彈性更高, 效能更好.

這裡要來看看 LibreOffice 與 Python3 該如何整合應用.

由於 Python3 的輕薄短小, 而且功能夠用, 因此 LibreOffice 從第四版就已經內建 Python3 核心程式碼 (採 Python 3.3.0 版), 因此只要將 Python3 程式的解譯器指向 LibreOffice 內建的 python.exe, 就可以利用 Python3 的程式來自動化 LibreOffice 檔案的某些工作.

利用 Python3 程式將 .odt 檔案 (開放格式的文字檔案內容), 轉為 pdf 格式.

#coding: utf-8
# 導入 uno 模組, 這是 LibreOffice 內建的 universal network object 模組
import uno
import os
# 導入 PropertyValue 方法
from com.sun.star.beans import PropertyValue 
# 要執行此程式之前, 必須先啟動 LibreOffice 伺服程式, 若在近端則執行 soffice "-accept=socket,host=localhost,port=2002;urp;"
# uno 可以利用 socket 跨網路進行檔案資料的存取
# 先設法開啟一個檔案
# 從 PyUNO 組件中取得文件內容
localContext = uno.getComponentContext()
# 建立所需的 UnoUrlResolver
resolver = localContext.ServiceManager.createInstanceWithContext(
				"com.sun.star.bridge.UnoUrlResolver", localContext )
# 連結到執行中的 LibreOffice
ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
# 建立 Service Manager
smgr = ctx.ServiceManager
# 透過 Service Manager, 建立對應的核心桌面物件
desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)
# 利用 PropertyVale() 建立所需的檔案物件名稱與屬性
property = PropertyValue()
property.Name = "Hidden"
property.Value = True
# access the current writer document
#model = desktop.getCurrentComponent()
# 開啟近端的 odt 檔案
url = uno.systemPathToFileUrl("V:/file1.odt") 
# 利用已經建立的名稱與屬性, 載入所要開啟的檔案
model = desktop.loadComponentFromURL(url, "_blank", 0,  (property,))
# 擷取文件的 text 屬性
text = model.Text
# 從 text 屬性建立游標
cursor = text.createTextCursor()
# 利用 text 與游標(位於文件最前頭)
for line_number in range(10):
    text.insertString( cursor, str(line_number)+": Hello World\n", 0 )
# 建立寫出檔案所需的檔案屬性
property1 = PropertyValue()
property1.Name = "FilterName"
# 希望輸出 PDF 檔案格式
property1.Value ="writer_pdf_Export"
# 直接存在近端硬碟
model.storeToURL("file:///V:/conver_test.pdf", (property1,))
# 存檔後關閉 model 物件
model.close(False)
# 退出 Service Manager
ctx.ServiceManager

 將 LibreOffice Spreadsheet 檔案內容轉為 pdf

#coding: utf-8
# 導入 uno 模組, 這是 LibreOffice 內建的 universal network object 模組
import uno
import os
# 導入 PropertyValue 方法
from com.sun.star.beans import PropertyValue 
# 要執行此程式之前, 必須先啟動 LibreOffice 伺服程式, 若在近端則執行 soffice "-accept=socket,host=localhost,port=2002;urp;"
# uno 可以利用 socket 跨網路進行檔案資料的存取
# 先設法開啟一個檔案
# 從 PyUNO 組件中取得文件內容
localContext = uno.getComponentContext()
# 建立所需的 UnoUrlResolver
resolver = localContext.ServiceManager.createInstanceWithContext(
                "com.sun.star.bridge.UnoUrlResolver", localContext )
# 連結到執行中的 LibreOffice
ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
# 建立 Service Manager
smgr = ctx.ServiceManager
# 透過 Service Manager, 建立對應的核心桌面物件
desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)
# 利用 PropertyVale() 建立所需的檔案物件名稱與屬性
property = PropertyValue()
property.Name = "Hidden"
property.Value = True
# access the current writer document
#model = desktop.getCurrentComponent()
# 開啟近端的 ods 檔案
url = uno.systemPathToFileUrl("V:/file1.ods") 
# 利用已經建立的名稱與屬性, 載入所要開啟的檔案
model = desktop.loadComponentFromURL(url, "_blank", 0,  (property,))
# 開啟 LibreOffice Spreadsheet 檔案資料頁面
sheet = model.getCurrentController().getActiveSheet() 
# 利用迴圈, 在第一行與第二行寫入資料
for row in range(10):
    #  第一行索引值為 0, 而列索引值也是從 0 開始
    # add data for column 1, index is 0
    cell = sheet.getCellByPosition(0, row)
    cell.setString(str(row)+": Hello World")
    # add data for column 2, index is 1
    cell = sheet.getCellByPosition(1, row)
    cell.setValue(row)
# 建立寫出檔案所需的檔案屬性
property1 = PropertyValue()
property1.Name = "FilterName"
# 希望輸出 PDF 檔案格式
property1.Value ="writer_pdf_Export"
# 直接存在近端硬碟
model.storeToURL("file:///V:/conver_test2.pdf", (property1,))
# 存檔後關閉 model 物件
model.close(False)
# 退出 Service Manager
ctx.ServiceManager

參考檔案: LibreOffice_Python3_ex1.7z

參考資料:

1. http://www.openoffice.org/udk/python/

2. http://www.openoffice.org/udk/python/python-bridge.html

3. https://github.com/dagwieers/unoconv

4. 整合 OpenOffice 與 Python