使用Python3將word文檔和pdf電子書進行格式互轉(兼容Windows/Linux)

原文轉載自「劉悅的技術博客」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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章