这几天有件大爽事。
之前一直放在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 修改
说明:
使用该程序进行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真的“轻量”了么?
开发上线一两周,部署环境两三月。尴不尬?