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:\\1.docx","D:\\test.pdf");
        wordToPdf2("D:\\1.docx", "D:\\test.pdf");
       // wordToPdf3("D:\\1.docx", "D:\\test.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以内。

Node.js 是一种在服务器端运行的 JavaScript 运行环境,可以用于实现各种各样的应用程序。而 LibreOffice 是一款免费、开源的办公软件套件,其中包括了 Writer、Calc、Impress 等应用程序,支持多种文档格式。下面是一个基于 Node.js 和 LibreOffice 的实现 Word PDF 的简单方法: 1.安装 LibreOffice:首先需要在服务器上安装 LibreOffice,可以通过命令行或者图形界面进行安装。 2.使用 Node.js 的 child_process 模块:在 Node.js 中可以通过 child_process 模块来执行系统命令,在本例中可以使用该模块执行 LibreOffice 的命令行工具来进行 Word PDF 的操作。 3.编写 Node.js 代码:可以通过 Node.js 编写一个简单的脚本来实现 Word PDF。以下是一个简单的示例代码: ```javascript const { spawn } = require('child_process'); const inputFilePath = '/path/to/input.docx'; const outputFilePath = '/path/to/output.pdf'; const libreoffice = spawn('libreoffice', [ '--headless', '--convert-to', 'pdf', inputFilePath, '--outdir', outputFilePath, ]); libreoffice.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); libreoffice.stderr.on('data', (data) => { console.error(`stderr: ${data}`); }); libreoffice.on('close', (code) => { console.log(`child process exited with code ${code}`); }); ``` 以上代码中,spawn 方法会启动一个新的进程来执行 LibreOffice 命令行工具。'--headless' 参数表示以无头模式运行,'--convert-to pdf' 参数表示换成 PDF 格式,inputFilePath 参数表示输入文件的路径,'--outdir' 参数表示输出文件的路径。 4.运行 Node.js 代码:在终端中运行 Node.js 脚本即可进行 Word PDF 的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值