這幾天有件大爽事。
之前一直放在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真的“輕量”了麼?
開發上線一兩週,部署環境兩三月。尷不尬?