kotlin 基於libreoffice的docx文件預覽

本文主要記錄了使用kotlin docx轉化pdf的實現方式以及主流的方案的對比分析html

首先要實現docx文件在瀏覽器的預覽,能夠想到的有幾種思路前端

1.轉化docx文件到htmljava

2.轉化docx到pdf而後前端用pdf.js之類的打開預覽python

3.直接使用微軟體系的東西 office web apps server (這個不作研究,由於沒有windows server 全部的服務器都用linux)linux

而後經過百度和google找了不少方式,搜尋到如下幾種可嘗試的方案web

1.使用Apache POI 導出成html或者pdfbootstrap

2.使用python腳本模擬瀏覽器調用別的網站的pdf轉化功能segmentfault

3.使用docx4jwindows

4.使用libreoffice 導出成pdf瀏覽器

最後本身上陣把全部的都試了一遍

1.POI簡單易用簡單的docx能夠完美的轉化出來,可是稍微複雜的格式直接文字丟失,圖片丟失,最終沒法使用

2.腳本調用,調用了一會,服務器就直接反饋錯誤多是對IP作了次數限制,這個也沒法使用(若是能找到可靠的網站也能夠一試,這個效果通常比較好轉化出來的pdf質量高)

3. docx4j 和poi同樣

4.libreoffice對於簡單的docx能夠完美轉化,複雜格式稍微有變形,可是總體內容沒有丟失,轉化出來的東西能夠接受,做爲內部系統徹底夠用

 

具體代碼以下

gradle

compile 'org.libreoffice:unoil:5.4.2'
compile 'org.libreoffice:ridl:5.4.2'
compile 'org.libreoffice:jurt:5.4.2'
compile 'org.libreoffice:juh:5.4.2'
compile group: 'org.openoffice', name: 'bootstrap-connector', version: '0.1.1'

kotlin

package com.test.test01

import com.sun.star.beans.PropertyValue
import com.sun.star.frame.XDesktop
import com.sun.star.uno.UnoRuntime
import com.sun.star.frame.XComponentLoader
import java.io.File
import com.sun.star.frame.XStorable
import ooo.connector.BootstrapSocketConnector


fun main(args: Array<String>) {
    try {

        val xContext = BootstrapSocketConnector.bootstrap("D:\\Program Files\\LibreOffice 5\\program")

        val xMCF = xContext.getServiceManager()

        val oDesktop = xMCF.createInstanceWithContext(
                "com.sun.star.frame.Desktop", xContext)

        val xDesktop = UnoRuntime.queryInterface(
                XDesktop::class.java, oDesktop) as XDesktop

        val workingDir = "d:/upload/"
        val myTemplate = "aaaaaa.docx"

        if (!File(workingDir + myTemplate).canRead()) {
            throw RuntimeException("Cannot load template:" + File(workingDir + myTemplate))
        }

        val xCompLoader = UnoRuntime
                .queryInterface(com.sun.star.frame.XComponentLoader::class.java, xDesktop) as XComponentLoader

        val sUrl = "file:///" + workingDir + myTemplate

        var propertyValues = arrayOfNulls<PropertyValue>(0)

        propertyValues = arrayOfNulls<PropertyValue>(1)
        propertyValues[0] = PropertyValue()
        propertyValues[0]!!.Name = "Hidden"
        propertyValues[0]!!.Value = true

        val xComp = xCompLoader.loadComponentFromURL(
                sUrl, "_blank", 0, propertyValues)

        val xStorable = UnoRuntime
                .queryInterface(XStorable::class.java, xComp) as XStorable

        propertyValues = arrayOfNulls(2)
        propertyValues[0] = PropertyValue()
        propertyValues[0]!!.Name = "Overwrite"
        propertyValues[0]!!.Value = true
        propertyValues[1] = PropertyValue()
        propertyValues[1]!!.Name = "FilterName"
        propertyValues[1]!!.Value = "writer_pdf_Export"

// Appending the favoured extension to the origin document name
        val myResult = workingDir + "letterOutput.pdf"
        xStorable.storeToURL("file:///" + myResult, propertyValues)

        println("Saved " + myResult)

    } catch (e: Exception) {
        e.printStackTrace()
    }

}

最終代碼來源於 https://segmentfault.com/a/1190000006789644 這裏有java版本的代碼

字體文件缺失形成的亂碼問題能夠參考 http://os.chinaunix.net/a2006/0831/1003/000001003262.shtml安裝字體之後亂碼問題就可修復

相關文章
相關標籤/搜索