引言
最近由于项目需要一个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依赖
<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>
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();
}
}