共计 2612 个字符,预计需要花费 7 分钟才能阅读完成。
导读 | 一些重要文档格式之间的互转在目前显得尤为重要,pdf 作为通用格式在现在各个平台上兼容性是最好的,所以写 python 脚本将这些 word 文档批量转换 pdf 是最好的解决方案。 |
由于 windows 系统对于 word 文档有天然的兼容性优势,所以转换起来很简单,普遍上是通过 comtypes 模块。
pip3 install comtypes
from comtypes.client import CreateObject
import os
def wd_to_pdf(folder):
#获取指定目录下面的所有文件
files = os.listdir(folder)
#获取 word 类型的文件放到一个列表里面
wdfiles = [f for f in files if f.endswith((".doc", ".docx"))]
for wdfile in wdfiles:
#将 word 文件放到指定的路径下面
wdPath = os.path.join(folder, wdfile)
#设置将要存放 pdf 文件的路径
pdfPath = wdPath
#判断是否已经存在对应的 pdf 文件,如果不存在就加入到存放 pdf 的路径内
if pdfPath[-3:] != 'pdf':
pdfPath = pdfPath + ".pdf"
#将 word 文档转化为 pdf 文件,先打开 word 所在路径文件,然后在处理后保存 pdf 文件,最后关闭
pdfCreate = self.wdToPDF.Documents.Open(wdPath)
pdfCreate.SaveAs(pdfPath, self.wdFormatPDF)
其实难点还是在 Linux 系统下如何转换,因为 comtypes 依赖的 win32com 模块在 linux 下是无法使用的,所以在 linux 下面推荐另外一套解决方案也就是 LibreOffice,LibreOffice 能够与 Microsoft Office 系列以及其它开源办公软件深度兼容,且支持的文档格式相当全面。
首先卸载当前系统的 libreoffice,因为大多数系统默认安装的都是低版本,我们要使用的是最新稳定版
yum remove libreoffice-*
在 https://www.libreoffice.org/download/download/ 上下载最新的稳定版 gz 压缩包
安装 java 依赖
yum -y install java-1.8.0-openjdk*
然后将刚才下载的 gz 压缩包解压后安装
tar xvf LibreOffice_6.2.5.2_Linux_x86-64_rpm.tar.gz
cd LibreOffice_6.2.5.2_Linux_x86-64_rpm/RPMS/
yum localinstall *.rpm
最后安装一些依赖
yum install cairo cups-libs libSM
yum install ibus
yum install libreoffice-headless
在命令行输入
libreoffice -help
会显示帮助文档就没问题了
解决中文乱码问题
安装 windows 字体(不装,会有乱码)将 windows 的字体复制到 linux 上 C:WindowsFonts* windows 上所有的字体(尝试过只复制部分,还是有乱码,全部字体就不会乱码了),上传到 linux 的 /usr/share/fonts/chinese(‘chinese’ 目录是我自己建的,mkdir chinese)
chmod -R 755 /usr/share/fonts/chinese // 修改权限
fc-cache -fv // 建立字体缓存
fc-list | grep chinese // 可以查看到已安装新增的字体了
如果你嫌麻烦,也可以修改系统语言来支持中文
执行命令:
yum groupinstall "fonts"
安装成功后,
打开
vim /etc/locale.conf
按键 i 进入编辑模式, 把内容改为
LANG="zh_CN.UTF-8"
wq 存盘
然后重启服务器 reboot
之后也可以支持中文转换了
转换命令
libreoffice6.2 --headless --convert-to pdf /root/4321.docx
此时,我们要改造一下转换脚本,做到可以兼容 windows 和 Linx 双系统,任意系统下都可以调用脚本进行转换
import subprocess
import os
try:
from comtypes import client
except ImportError:
client = None
def doc2pdf(doc):
"""
convert a doc/docx document to pdf format
:param doc: path to document
"""
doc = os.path.abspath(doc) # bugfix - searching files in windows/system32
if client is None:
return doc2pdf_linux(doc)
name, ext = os.path.splitext(doc)
try:
word = client.DispatchEx("Word.Application")
worddoc = word.Documents.Open(doc)
worddoc.SaveAs(name + '.pdf', FileFormat=17)
except Exception:
raise
finally:
worddoc.Close()
word.Quit()
def doc2pdf_linux(doc):
"""
convert a doc/docx document to pdf format (linux only, requires libreoffice)
:param doc: path to document
"""cmd ='libreoffice6.2 --headless --convert-to pdf'.split() + [doc]
p = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
p.wait(timeout=10)
stdout, stderr = p.communicate()
if stderr:
raise subprocess.SubprocessError(stderr)
简直完美,可以收工了