原文轉載自「劉悅的技術博客」https://v3u.cn/a_id_96
一些重要文檔格式之間的互轉在目前顯得尤爲重要,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)
簡直完美,可以收工了
原文轉載自「劉悅的技術博客」 https://v3u.cn/a_id_96