背景

由于最近要使用到文件转换的功能,我把pdf转word还是挺轻松的(pdf2docx),想着word转pdf也不在话下,轻轻松松搞定,结果却让人大相径庭,通过一系列的尝试,最终问题解决。

本来刚开始在windows下功能都写完了,但一上linux立马不行,说没这没那的,通过调研才发现,有很多工具都是windows好好的,但是Liunx确无法兼容,比如:python的docx2pdf,java的documents4j,在本地都好好的,以上环境立马歇菜。

就此把Linux需要用到的部署过程总结如下:

一、工具

插件工具:LibreOfice、unoconv

声明,这工具是开源的,不用担心后顾之忧

二、LibreOffice安装过程

1、 下载pm文件

1、官网下载安装

Download LibreOffice | LibreOffice - Free Office Suite - Based on OpenOffice - Compatible with Microsoft

我下载的是7.5.3.2

2.wget下载

https://downloadarchive.documentfoundation.org/libreoffice/old/7.5.3.2/rpm/x86_64/LibreOffice_7.5.3.2_Linux_x86-64_rpm.tar.gz Linux可执行

​wget https://downloadarchive.documentfoundation.org/libreoffice/old/7.5.3.2/rpm/x86_64/LibreOffice_7.5.3.2_Linux_x86-64_rpm.tar.gz

2、解压

tar -zxvf LibreOffice_7.5.3.2_Linux_x86-64_rpm.tar.gz

3、进入RPMS目录下

cd /data/software/LibreOffice_7.5.3.2_Linux_x86-64_rpm/RPMS

4、安装rpm文件 

sudo rpm -Uivh *.rpm --nodeps

如果提示rpm不存在执行这个就行
sudo apt install rpm

5、添加到环境变量

sudo vi /etc/profile
export LibreOffice_PATH=/opt/libreoffice7.5/program
export PATH=$LibreOffice_PATH:$PATH

6、激活环境配置

source /etc/profile

7、验证LibreOffice是否可用

 命令:libreoffice7.5 --version


至此LibreOffice安装完成

三、unoconv安装

sudo apt install unoconv

四、python将docx转pdf代码实现

import subprocess
import os

# docx转成pdf方法
def docx2pdf(docx_path,pdf_path) -> any:
    if os.path.isfile(pdf_path):
		return pdf_path
	command = ['sudo','unoconv', '-f', 'pdf', '--output', pdf_path, docx_path]
	result = subprocess.run(command, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
	if result.stderr:
		 raise FileCoverError(ErrorMassage.DOCX_2_PDF_COVER_FAILED+': '+result.stderr.decode())
	elif not os.path.isfile(pdf_path):
		raise FileCoverError(ErrorMassage.DOCX_2_PDF_COVER_FAILED)
	return pdf_path
	
# 方法执行
docx2pdf('/testfile/a1.docx', '/testfile/a1.pdf')

至此问题解决,word可转为pdf

https://blog.csdn.net/weixin_45187794/article/details/135817693

https://blog.csdn.net/Damien_J_Scott/article/details/139505776

https://blog.csdn.net/weixin_45502734/article/details/137818516

五、乱码问题

解决Linux下使用unoconv命令将word、xls、pptx转pdf中文乱码问题

转出pdf文档中文乱码

在Linux环境下word转成pdf。
在用unoconv做文档转换时,发现中文转换乱码,

解决方案

将 windows 下的字体全部拷贝到Linux字体库中并使之生效。

首先,在/usr/share/fonts/下新建文件夹 win 并设置权限,将 windows 下的 window-fonts 下字体全部拷贝到其中。然后,

cd /usr/share/fonts/ 
sudo mkdir win
cd win  //将本地win的字体打包上传到此目录中,解压

mkfontscale
mkfontdir            //这两条命令是生成字体的索引信息
fc-cache -fv        //更新字体缓存
fc-list :lang-zh     //查看已安装的中文字体

处理后的效果:

https://blog.csdn.net/guo_qiangqiang/article/details/107162680

六、sudo 跳过输入密码

遇到问题:

当我用非root用户在sudo unoconv的时候,总是提示我输密码,不输入密码就过不去,当在写在代码里面的时候就直接失败了,因为sudo不输入密码直接执行,对于普通用户来说变成了刚需的功能。

解决方案:

找到这样的行:%sudo ALL=(ALL:ALL) ALL。
在该行下面添加一行规则,允许用户或用户组不输入密码执行特定的命令

一开始在/etc/sudoers文件里面狂改,发现一直不生效,还是老让我输入密码,后来发现还有个文件/etc/sudoers.d/,需要把这里的改了

比如我叫allen:

vi /etc/sudoers.d/allen

加入如下内容:

allen ALL=(ALL) NOPASSWD: ALL
allen ALL=(ALL) NOPASSWD: /usr/bin/unoconv

这个是针对用户所有命令都不输入密码:allen ALL=(ALL) NOPASSWD: ALL
这个是针对用户的unoconv 命令不输入密码:allen ALL=(ALL) NOPASSWD: /usr/bin/unoconv 

根据你的需求自由选择

如果你不知道你的命令的绝对路径在哪儿可以用这个命令查询

which unoconv

https://blog.csdn.net/skywalk8163/article/details/141175473

https://blog.csdn.net/weixin_44065196/article/details/137143915

在执行就直接跳过输入密码环节了,代码可以畅通无阻的执行了,问题解决!!!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐