linux ubuntu环境安装libreoffice,word转pdf
一、环境
Ubuntu Server 22.04 LTS 64位
使用安装包上传方式安装
推荐下自己写的springboot整合libreoffice的,除了本地整合外,还有一个远程方式整合
docker中同时部署应用和libreoffice;springboot整合libreoffice(两种方式,使用本地和远程的libreoffice)
二、步骤
2.1、下载安装包
首先去官网下载对应的安装包
LibreOffice 简体中文官方网站 - 自由免费的办公套件
也有官方的安装教程
官方教程
2.2、上传
我使用的是竞价服务器(不是长久的使用感觉还挺划算的,云服务器)
它没提供root用户,使用的是ubuntu用户,所以只能上传到/home/ubuntu中,感觉有点小麻烦吧
2.2、安装
之后先挪到opt目录中(个人习惯,官网也是用的opt目录)
#切换为root用户
sudo -i
#移动文件
mv /home/ubuntu/LibreOffice_24.2.5_Linux_x86-64_deb.tar.gz /opt
然后解压
tar -xvf LibreOffice_24.2.5_Linux_x86-64_deb.tar.gz
进入到DEBS
目录中去
cd /opt/LibreOffice_24.2.5.2_Linux_x86-64_deb/DEBS/
之后执行命令
sudo dpkg -i *.deb
# centos的应该是这个
sudo yum install *.rpm
此时再进入opt中,会发现多了一个文件夹
此时可以直接直接libreoffice24.2
命令,注意加你自己对应的版本号,我的是24.2
报错如下:
/opt/libreoffice24.2/program/oosplash: error while loading shared libraries:
libXinerama.so.1: cannot open shared object file: No such file or directory
查了下libXinerama,https://www.coder.work/article/1507347
安装
sudo apt install libxinerama1
再次运行还会有报错,请往下看
2.3、尝试转换命令
用到的命令为soffice
直接运行找不到
所以需要设置下环境变量
vim /etc/profile
export LibreOffice_PATH=/opt/libreoffice24.2/program
export PATH=$LibreOffice_PATH:$PATH
刷新环境变量配置
source /etc/profile
此时无论是运行soffice
还是libreoffice24.2
都会报下面的错误
很明显是缺少java环境,安装一个便是(不清楚是使用云服务器的原因,还是apt就是这么方便,不用设置环境变量)
sudo apt update
sudo apt install openjdk-8-jdk
java -version
再次运行命令,这个错误就不用管了
2.4、尝试转换文件
上传个文件到服务器,执行命令
soffice --headless --convert-to pdf ./222.docx --outdir ./
可以看到转换成功
三、其他问题
下载对应的pdf文件查看,发现中文字体丢失
此时需要上传下中文字体,可以直接去这边下载(另外多说一句,这个kkfileview的部分预览就是基于libreoffice做的)
http://kkfileview.keking.cn/zh-cn/docs/faq.html
下载后,丢到/usr/share/fonts中就行了
mv /home/ubuntu/zhFonts/ /usr/share/fonts/
ubuntu我试了下,别的操作不需要了,可能centos还需要执行下上面截图的东西
转换的pdf已经正常
参考文档
https://blog.csdn.net/qq_61819109/article/details/140225903
https://www.cnblogs.com/lwjQAQ/p/16505854.html
四、使用缘由
因为要使用预览的功能,所以要生成word或者pdf文档。
尝试了很多,只有word模板生成比较方便灵活,pdf只有比较简单的模板生成(还需要使用Adobe Acrobat DC),最终还是选择了word模板生成。
但是看了很多前端组件,根本无法原模原样的展示word文档在前端 ,毕竟使用word另存为html都无法原模原样。。。
于是,只能寻求方法,尝试使用word转pdf,但是尝试了很多,发现转换时间都很长,可以自行尝试下
public class WordToPdfTest {
public static void main(String[] args) throws Exception {
//wordToPdf1("D:.docx","D: est.pdf");
wordToPdf2("D:.docx", "D: est.pdf");
// wordToPdf3("D:.docx", "D: est.pdf");
}
//poi的 6460ms
public static void wordToPdf1(String docFile, String pdfFile) throws IOException {
long start = System.currentTimeMillis();
XWPFDocument document;
InputStream doc = new FileInputStream(docFile);
document = new XWPFDocument(doc);
PdfOptions options = PdfOptions.create();
OutputStream out = new FileOutputStream(pdfFile);
PdfConverter.getInstance().convert(document, out, options);
doc.close();
out.close();
System.out.println(System.currentTimeMillis()-start);
}
//aspose.words 4058ms
public static void wordToPdf2(String wordFile, String pdfFile) throws Exception {
long start = System.currentTimeMillis();
//新建一个pdf文档
File file = new File(pdfFile);
FileOutputStream os = new FileOutputStream(file);
Document wordDoc = new Document(wordFile);
PdfSaveOptions pso = new PdfSaveOptions();
wordDoc.save(pdfFile, pso);
System.out.println(System.currentTimeMillis() - start);
}
//docx4j 11025ms
public static void wordToPdf3(String wordFile, String pdfFile) throws Exception {
long start = System.currentTimeMillis();
WordprocessingMLPackage pkg = Docx4J.load(new File(wordFile));
Mapper fontMapper = new IdentityPlusMapper();
fontMapper.put("隶书", PhysicalFonts.get("LiSu"));
fontMapper.put("宋体", PhysicalFonts.get("SimSun"));
fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei"));
fontMapper.put("黑体", PhysicalFonts.get("SimHei"));
fontMapper.put("楷体", PhysicalFonts.get("KaiTi"));
fontMapper.put("新宋体", PhysicalFonts.get("NSimSun"));
fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai"));
fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong"));
fontMapper.put("仿宋", PhysicalFonts.get("FangSong"));
fontMapper.put("幼圆", PhysicalFonts.get("YouYuan"));
fontMapper.put("华文宋体", PhysicalFonts.get("STSong"));
fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong"));
fontMapper.put("等线", PhysicalFonts.get("SimSun"));
fontMapper.put("等线 Light", PhysicalFonts.get("SimSun"));
fontMapper.put("华文琥珀", PhysicalFonts.get("STHupo"));
fontMapper.put("华文隶书", PhysicalFonts.get("STLiti"));
fontMapper.put("华文新魏", PhysicalFonts.get("STXinwei"));
fontMapper.put("华文彩云", PhysicalFonts.get("STCaiyun"));
fontMapper.put("方正姚体", PhysicalFonts.get("FZYaoti"));
fontMapper.put("方正舒体", PhysicalFonts.get("FZShuTi"));
fontMapper.put("华文细黑", PhysicalFonts.get("STXihei"));
fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB"));
fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312"));
pkg.setFontMapper(fontMapper);
Docx4J.toPDF(pkg, new FileOutputStream(pdfFile));
System.out.println(System.currentTimeMillis() - start);
}
}
需要的pom可以参考该文章
https://www.modb.pro/db/566986
后来发现了kkfileview
,但是它不支持post请求(也不太想去修改源码,另外因为列表中每个数据都会使用word模板来渲染出来一个word,每个文件都存本地也不太好,于是舍弃),拉了下其代码,发现其底层用到了libreoffice。于是,试了下它的转换速度,发现意外的还不错,小文件基本在1s以内。