kotlin 基于libreoffice的docx文件预览

本文主要记录了使用kotlin docx转化pdf的实现方式以及主流的方案的对比分析

首先要实现docx文件在浏览器的预览,可以想到的有几种思路

1.转化docx文件到html

2.转化docx到pdf然后前端用pdf.js之类的打开预览

3.直接使用微软体系的东西 office web apps server (这个不做研究,因为没有windows server 所有的服务器都用linux)

然后通过百度和google找了很多方式,搜寻到以下几种可尝试的方案

1.使用Apache POI 导出成html或者pdf

2.使用python脚本模拟浏览器调用别的网站的pdf转化功能

3.使用docx4j

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安装字体以后乱码问题就可修复

转载于:https://my.oschina.net/u/2271681/blog/1626983

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值