讲真,别再用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真的“轻量”了么?

开发上线一两周,部署环境两三月不尬?

 

 

你可能感兴趣的:(Python,Django,Python探索笔记)