Linux下SpringBoot实现Word转PDF

引言

最近由于项目需要一个Word在线预览的功能,由于考虑基于Linux平台做部署,实现真正的Word在线预览是不现实的,所以考虑通过Word转PDF实现PDF的在线预览。

经过一番研究,试了多种方式包括POI实现Word转PDF,以及Word转HTML再转PDF等方式,但均存在操作非常复杂和效果不理想以及兼容性不好等问题,最终锁定借助LibreOffice实现Word转PDF的方案。

Linux安装LibreOffice(在Ubuntu Server 18.04下实验)

1.访问http://download.documentfoundation.org/libreoffice/stable/6.2.2/deb/x86_64/ 下载离线安装包:

  • LibreOffice_6.2.2_Linux_x86-64_deb.tar.gz
  • LibreOffice_6.2.2_Linux_x86-64_deb_langpack_zh-CN.tar.gz
  • LibreOffice_6.2.2_Linux_x86-64_deb_sdk.tar.gz

2.将三个安装包复制到Linux系统,执行以下指令:

sudo mkdir /opt/libreoffice

sudo tar -zxvf LibreOffice_6.2.2_Linux_x86-64_deb.tar.gz -C /opt/libreoffice/

sudo tar -zxvf LibreOffice_6.2.2_Linux_x86-64_deb_langpack_zh-CN.tar.gz -C /opt/libreoffice/

sudo tar -zxvf LibreOffice_6.2.2_Linux_x86-64_deb_sdk.tar.gz -C /opt/libreoffice/

cd /opt/libreoffice/LibreOffice_6.2.2.2_Linux_x86-64_deb/DEBS

sudo dpkg -i *.deb

cd /opt/libreoffice/LibreOffice_6.2.2.2_Linux_x86-64_deb_sdk/DEBS

sudo dpkg -i *.deb

cd /opt/libreoffice/LibreOffice_6.2.2.2_Linux_x86-64_deb_langpack_zh-CN/DEBS

sudo dpkg -i *.deb

sudo apt-get install libxinerama1

sudo apt-get install libcairo2-dev

sudo apt-get install libcups2-dev

Word转PDF测试

libreoffice6.2 --headless --invisible --convert-to pdf <待转换的word路径> --outdir <生成的pdf路径>

此时可在输出目录看到已经生成了转换后的PDF文件,但是打开查看文件发现字符乱码。

添加字体支持

1.下载如下字体:

  • simsun.ttc 宋体
  • simhei.ttf 黑体
  • msyh.ttf 微软雅黑
  • msyhbd.ttf 微软雅黑

2.在/usr/share/fonts/truetype下面建立一个文件夹CustomizedGonts,把字体文件复制进来。

3.把字体文件夹和字体文件都赋予权限

sudo chmod 777 CustomizedFonts
cd CustomizedFonts
sudo chmod 777 *

4.安装字体

sudo mkfontscale
sudo mkfontdir
sudo fc-cache

Word转PDF测试

libreoffice6.2 --headless --invisible --convert-to pdf <待转换的word路径> --outdir <生成的pdf路径>

此时可在输出目录看到已经生成了转换后的PDF文件,并且文字显示正常。

Spring Boot工程

1.添加Maven依赖


    org.jodconverter
    jodconverter-core
    4.2.0


    org.jodconverter
    jodconverter-local
    4.2.0


    org.jodconverter
    jodconverter-spring-boot-starter
    4.2.0


    org.libreoffice
    ridl
    5.4.2

2.配置application.ptoperties

jodconverter.local.enabled=true
jodconverter.local.office-home=/opt/libreoffice6.2
jodconverter.local.port-numbers=8100,8101,8102
jodconverter.local.max-tasks-per-process=100

3.pdf转换代码

@RestController
@RequestMapping("/doc")
public class PDFController {

    @Autowired
    private DocumentConverter documentConverter;

    @RequestMapping("/pdf")
    public void toPdf() throws OfficeException {
        File word = new File("/home/doc/123.doc");
        File pdf = new File("/home/doc/123.pdf");
        documentConverter.convert(word).to(pdf).execute();
    }
}

你可能感兴趣的:(Linux下SpringBoot实现Word转PDF)