引言
最近由于项目需要一个Word在线预览的功能,由于考虑基于Linux平台做部署,实现真正的Word在线预览是不现实的,所以考虑通过Word转PDF实现PDF的在线预览。
经过一番研究,试了多种方式包括POI实现Word转PDF,以及Word转HTML再转PDF等方式,但均存在操作非常复杂和效果不理想以及兼容性不好等问题,最终锁定借助LibreOffice实现Word转PDF的方案。
Linux安装LibreOffice(在Ubuntu Server 18.04下实验)
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 --outdir
此时可在输出目录看到已经生成了转换后的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 --outdir
此时可在输出目录看到已经生成了转换后的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();
}
}