Linux上使用python代码将docx转pdf--LibreOffice安装、文件乱码、转换执行权限等问题
由于最近要使用到文件转换的功能,我把pdf转word还是挺轻松的(pdf2docx),想着word转pdf也不在话下,轻轻松松搞定,结果却大相径庭,通过一系列的尝试,最终问题解决。本来刚开始在windows下功能都写完了,但一上linux立马不行,说没这没那的,通过调研才发现,有很多工具都是windows好好的,但是Liunx确无法兼容,比如:python的docx2pdf,java的docume
背景
由于最近要使用到文件转换的功能,我把pdf转word还是挺轻松的(pdf2docx),想着word转pdf也不在话下,轻轻松松搞定,结果却让人大相径庭,通过一系列的尝试,最终问题解决。
本来刚开始在windows下功能都写完了,但一上linux立马不行,说没这没那的,通过调研才发现,有很多工具都是windows好好的,但是Liunx确无法兼容,比如:python的docx2pdf,java的documents4j,在本地都好好的,以上环境立马歇菜。
就此把Linux需要用到的部署过程总结如下:
一、工具
插件工具:LibreOfice、unoconv
声明,这工具是开源的,不用担心后顾之忧
二、LibreOffice安装过程
1、 下载pm文件
1、官网下载安装
我下载的是7.5.3.2
2.wget下载
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
在执行就直接跳过输入密码环节了,代码可以畅通无阻的执行了,问题解决!!!
更多推荐
所有评论(0)