講真,別再用win32com包來實現Word文檔轉PDF了

這幾天有件大爽事。

之前一直放在Django原生的服務器的網站,終於放到Apache上了。並不是配置多難,也不是我懶,問題出在了用win32com實現word轉pdf,我不能使用這個插件讀取word,一直返回None。

下面的代碼是win32com進行文件轉化的標準代碼,當時也是修改了好久才弄出來的,留給有需要的人吧。

# 這是我當時的語句
# 本地跑或者用Django原生服務器跑一點問題都沒有,一放到Apache上就讀不到了。

def doc2pdf(doc_name, pdf_name):
    # 停止使用
    """
    :word文件轉pdf
    :param doc_name word文件名稱
    :param pdf_name 轉換後pdf文件名稱
    """
    pythoncom.CoInitialize()
    word = client.DispatchEx("Word.Application")

    worddoc = word.Documents.Open(doc_path, ReadOnly=False)  # 讀word文件,一直返回None

    worddoc.SaveAs(pdf_name, FileFormat=17)  # 存儲爲pdf文件
     
    worddoc.Close()
    word.Quit()
    pythoncom.CoUninitialize()

歷經磨難,曲線救國。我找到了一個本來應該放在Linux環境中的方法(具體的下載、配置的細節在這篇文章中),大意是說可以使用Libre Office的soffice.exe插件直接進行PDF轉化。

我修改的代碼如下:

def trans_pdf_by_libre_model(docx_name, pdf_dir_path):
    """
    zihe  20200405 修改
    說明:
        使用該程序進行doc文檔轉化pdf
        原理:通過libreOffice開源軟件,配置其環境變量,達到用命令行可以轉化pdf的目的
        soffice --headless --convert-to pdf ./1.docx
        可以通過python模擬命令行操作,即完成了本次程序的升級
    :param doc_name word文件名稱
    :param pdf_name 轉換後pdf文件名稱
    """
    command = 'soffice --headless --convert-to pdf {0} --outdir {1}'.format(docx_name, pdf_dir_path)  # 命令行
    # e.g.: soffice --headless --convert-to pdf ./docx/1.docx -outdir ./pdf/
    # 這裏pdf的位置只需要到文件夾即可,這個例子中,pdf會自動保存爲'./pdf/1.pdf '

    os.system(command)  # 執行

同時,Apache可以完美兼容這種轉化模式,成功部署到了Apache服務器上,使我們的網站定性、安全性上升。並且,這種方式進行的轉化明顯要於win32com的轉化。

最後,我想說,Django雖然可以做到輕量、快速地開發網站,但是爲了維持穩定和安全性,仍然不能缺少部署Apache等Web服務器軟件上這一步,而在部署環境的轉移過程中,會出現很多意想不到的問題,比如本文出現的這個win32com讀取失敗的情況,以及未做提及的絕對路徑和相對路徑的問題,這些問題會讓我作爲一個開發者很不爽。所以也不禁讓我反思,Django真的“輕量”了麼?

開發上線一兩週,部署環境兩三月不尬?

 

 

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