前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ubuntu上部署JobConverter + Ibreoffice环境

Ubuntu上部署JobConverter + Ibreoffice环境

作者头像
码客说
发布2020-06-22 15:21:10
1.5K0
发布2020-06-22 15:21:10
举报
文章被收录于专栏:码客

前言

本文内容主要目的在于测试Ibreoffice转换docx文档失败的原因是否和系统有关,之前我在CentOS上和MacOS上均转换不成功,但是使用一个开源的项目却可以,而他用的就是Ubuntu和Ibreoffice,抱着找到原因的心态在Ubuntu上进行测试。

实验结论

部分文档转换不成功,跟系统没有关系,猜测跟字体有关。

官网:https://zh-cn.libreoffice.org/download/libreoffice/

参数说明:https://help.libreoffice.org/Common/Starting_the_Software_With_Parameters/zh-CN

安装Ibreoffice

用APT安装

查看

代码语言:javascript
复制
sudo apt-cache search libreoffice

安装

代码语言:javascript
复制
# 卸载原来的
sudo apt remove libreoffice-*
# 安装
sudo apt-get install libreoffice
# 安装中文语言包
sudo apt-get install libreoffice-l10n-zh-cn libreoffice-help-zh-cn

查看版本

代码语言:javascript
复制
soffice --version

显示

LibreOffice 6.0.7.3 00m0(Build:3)

查看路径

代码语言:javascript
复制
which soffice

显示

/usr/bin/soffice

创建目录

代码语言:javascript
复制
sudo mkdir /usr/local/office_package
cd /usr/local/office_package

转换

代码语言:javascript
复制
soffice --headless --convert-to pdf /usr/local/office_package/0.docx --outdir /usr/local/office_package/

注意

libreoffice和openoffice原来是一家,所以早期版本的libreoffice命令和openoffice一样,后来版本的libreoffice就变了

官方下载安装

创建目录

代码语言:javascript
复制
sudo mkdir /usr/local/office_package
cd /usr/local/office_package

下载

代码语言:javascript
复制
wget https://mirror-hk.koddos.net/tdf/libreoffice/stable/6.4.4/deb/x86_64/LibreOffice_6.4.4_Linux_x86-64_deb.tar.gz

解压

代码语言:javascript
复制
cd /usr/local/office_package/
tar -zxvf LibreOffice_6.4.4_Linux_x86-64_deb.tar.gz

安装

代码语言:javascript
复制
cd /usr/local/office_package/LibreOffice_6.4.4.2_Linux_x86-64_deb/DEBS/
sudo dpkg -i *.deb

下载汉化包

代码语言:javascript
复制
cd /usr/local/office_package/
wget https://download.nus.edu.sg/mirror/tdf/libreoffice/stable/6.4.4/deb/x86_64/LibreOffice_6.4.4_Linux_x86-64_deb_langpack_zh-CN.tar.gz

解压

代码语言:javascript
复制
tar -zxvf LibreOffice_6.4.4_Linux_x86-64_deb_langpack_zh-CN.tar.gz

进入目录安装

代码语言:javascript
复制
cd /usr/local/office_package/LibreOffice_6.4.4.2_Linux_x86-64_deb_langpack_zh-CN/DEBS/
sudo dpkg -i *.deb

查看版本

代码语言:javascript
复制
libreoffice6.4 --version

查看可执行文件位置

代码语言:javascript
复制
which libreoffice6.4

卸载

代码语言:javascript
复制
sudo apt remove libreoffice*
sudo apt purge libreoffice*
sudo apt autoremove

安装字体

在转换中我们会发现转换的pdf和原文档字体是有差异的,是因为系统上没有我们需要的字体,所以我们要安装字体

查看现有字体

代码语言:javascript
复制
fc-list

打开目录

代码语言:javascript
复制
cd /usr/share/

我们会看到fontsfontconfig目录

添加字体

创建目录并进入

代码语言:javascript
复制
mkdir /usr/share/fonts/chinese
cd /usr/share/fonts/chinese

在Windows上找到C://Windows/Fonts下最后几列中文名称的字体都上传到/usr/share/fonts/chinese

设置目录权限

代码语言:javascript
复制
chmod -R 755 /usr/share/fonts/chinese

接下来需要安装xfonts-utils来搜索目录中所有的字体信息,并汇总生成fonts.scale文件,

输入命令:

代码语言:javascript
复制
apt install xfonts-utils

然后执行ttmkfdir命令即可:

代码语言:javascript
复制
mkfontdir

最后一步就是修改字体配置文件了,首先通过编辑器打开配置文件:

代码语言:javascript
复制
vi /etc/fonts/fonts.conf

可以看到一个Font list,即字体列表,在这里需要把我们添加的中文字体位置加进去:

代码语言:javascript
复制
<dir>/usr/share/fonts/chinese</dir>

最后别忘了刷新内存中的字体缓存,这样就不用reboot重启了:

代码语言:javascript
复制
fc-cache -fv

这样所有的步骤就算完成了,最后再次通过fc-list看一下字体列表:

代码语言:javascript
复制
fc-list

转换测试

下载doc文档

代码语言:javascript
复制
cd /usr/local/office_package/
wget http://wordupload.xhkjedu.com/resource/0/0.docx

转换参数

代码语言:javascript
复制
--convert-to pdf:writer_pdf_Export 1.doc
--convert-to "html:XHTML Writer File:UTF8" 1.doc
--convert-to "txt:Text (encoded):UTF8" 1.doc

可以简写为

代码语言:javascript
复制
--convert-to pdf 1.doc
--convert-to html 1.doc
--convert-to txt 1.doc

docx=>pdf

代码语言:javascript
复制
soffice  --headless --invisible --convert-to pdf /usr/local/office_package/5.docx --outdir /usr/local/office_package/

或者

代码语言:javascript
复制
soffice  --headless --invisible --convert-to pdf:writer_pdf_Export /usr/local/office_package/5.docx --outdir /usr/local/office_package/

或者

代码语言:javascript
复制
soffice  -env:UserInstallation=file:///$HOME/.libreoffice-headless/ \
--headless --invisible --convert-to pdf /usr/local/office_package/0.docx --outdir /usr/local/office_package/

我这里直接就成功了

docx=>jpg

代码语言:javascript
复制
soffice  --headless --invisible --convert-to jpg /usr/local/office_package/0.docx --outdir /usr/local/office_package/

或者

代码语言:javascript
复制
soffice  -env:UserInstallation=file:///$HOME/.libreoffice-headless/ \
--headless --invisible --convert-to jpg /usr/local/office_package/5.docx --outdir /usr/local/office_package/

docx=>html

代码语言:javascript
复制
soffice  -env:UserInstallation=file:///$HOME/.libreoffice-headless/ \
--headless --invisible --convert-to html /usr/local/office_package/5.docx --outdir /usr/local/office_package/

报错解决

问题描述:

Libreoffice发生转换不成功(比如转换wps文件),再做转换就会直接不做任何操作

当你运行其中一个LibreOffice的时候,再运行另外一个Libreoffice转换时,将不做任何操作。

导致这种问题的原因时有转换进程一直在运行,所以我们也可以杀掉进程

代码语言:javascript
复制
top

或者

代码语言:javascript
复制
top -bc |grep soffice.bin

查看卡死的进程杀死即可

代码语言:javascript
复制
kill -9 进程id

后端中使用

方式1(使用三方库)

代码语言:javascript
复制
<dependency>
  <groupId>org.jodconverter</groupId>
  <artifactId>jodconverter-core</artifactId>
  <version>4.2.0</version>
</dependency>
<dependency>
  <groupId>org.jodconverter</groupId>
  <artifactId>jodconverter-local</artifactId>
  <version>4.2.0</version>
</dependency>
<dependency>
  <groupId>org.jodconverter</groupId>
  <artifactId>jodconverter-spring-boot-starter</artifactId>
  <version>4.2.0</version>
</dependency>
<dependency>
  <groupId>org.libreoffice</groupId>
  <artifactId>ridl</artifactId>
  <version>5.4.2</version>
</dependency>

application.properties

代码语言:javascript
复制
jodconverter:
  local:
    enabled: true
    office-home: /opt/libreoffice6.1
    port-numbers: 8100,8101,8102
    max-tasks-per-process: 100

调用

代码语言:javascript
复制
@RestController
@RequestMapping("/doc")
public class LibreOfficeController {
   @Autowired
    private DocumentConverter documentConverter;
    @RequestMapping("/toPdf")
    public void toPdf() throws OfficeException {
     File wfile = new File("/usr/local/office_package/5.docx");
        File pfile = new File("/usr/local/office_package/5.pdf");
        documentConverter.convert(wfile).to(pfile).execute();
    }
}

方式2(运行命令形式)

代码语言:javascript
复制
/**
    * 利用libreOffice将office文档转换成pdf
    * @param inputFile  目标文件地址
    * @param pdfFile    输出文件夹
    * @return
    */
public static boolean convertOffice2PDF(String inputFile, String pdfFile){
    long start = System.currentTimeMillis();
    String command;
    boolean flag;
    String osName = System.getProperty("os.name");
    if (osName.contains("Windows")) {
        command = "cmd /c start soffice --headless --invisible --convert-to pdf " + inputFile + " --outdir " + pdfFile;
    }else {
        command = "soffice  --headless --invisible --convert-to pdf " + inputFile + " --outdir " + pdfFile;
    }
    flag = executeLibreOfficeCommand(command);
    long end = System.currentTimeMillis();
    logger.debug("用时:{} ms", end - start);
    return flag;
}


/**
    * 执行command指令
    * @param command
    * @return
    */
public static boolean executeLibreOfficeCommand(String command) {
    logger.info("开始进行转化.......");
    Process process;// Process可以控制该子进程的执行或获取该子进程的信息
    try {
        logger.debug("convertOffice2PDF cmd : {}", command);
        process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
        // 下面两个可以获取输入输出流
        // InputStream errorStream = process.getErrorStream();
        // InputStream inputStream = process.getInputStream();
    } catch (IOException e) {
        logger.error(" convertOffice2PDF {} error", command, e);
        return false;
    }
    int exitStatus = 0;
    try {
        exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值,返回0表示正常结束
        // 第二种接受返回值的方法
        int i = process.exitValue(); // 接收执行完毕的返回值
        logger.debug("i----" + i);
    } catch (InterruptedException e) {
        logger.error("InterruptedException  convertOffice2PDF {}", command, e);
        return false;
    }
    if (exitStatus != 0) {
        logger.error("convertOffice2PDF cmd exitStatus {}", exitStatus);
    } else {
        logger.debug("convertOffice2PDF cmd exitStatus {}", exitStatus);
    }
    process.destroy(); // 销毁子进程
    logger.info("转化结束.......");
    return true;
}

方式3

代码语言:javascript
复制
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

<dependency>
    <groupId>cn.keking</groupId>
    <artifactId>jodconverter-core</artifactId>
    <version>1.0-SNAPSHOT</version>
    <exclusions>
        <exclusion>
            <artifactId>commons-io</artifactId>
            <groupId>commons-io</groupId>
        </exclusion>
    </exclusions>
</dependency>

结论

  • 字体没有会导致转换后差异
  • WPS文件无论转为doc或docx都无法转换
  • 图片类型为嵌入型时部分转换图片丢失
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 安装Ibreoffice
      • 用APT安装
      • 官方下载安装
    • 卸载
      • 安装字体
        • 转换测试
          • docx=>pdf
          • docx=>jpg
          • docx=>html
          • 报错解决
        • 后端中使用
          • 方式1(使用三方库)
          • 方式2(运行命令形式)
          • 方式3
        • 结论
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档