python doc到docx转换,comtypes.Documents.Open抛出ValueError:NULL COM指针访问

Pra*_*yar 2 python windows apache django

背景

我有一个应用程序,我想在其中将 .doc 转换为 .docx。之后处理 .docx 文件以进行数据挖掘。最终用户使用 Web 界面访问此服务。Web 应用程序是在 Django 1.6 中开发的。

要将 .doc 转换为 .docx,我们需要安装了 MS Office 的 Windows 平台。话虽如此,我有一个 AWS Windows Server 2012 R2 实例(它是 Windows 64 位)正在运行。我将 Apache(64 位)与 mod_wsgi 和 Python 2.7.8(64 位)一起使用。


现在,这是我将 .doc 转换为 .docx 的代码

import tempfile, sys
import comtypes, comtypes.client

def convert(source):
    tmpfile = tempfile.NamedTemporaryFile(delete=False)
    tmpname = tmpfile.name + ".docx"
    tmpfile.close()
    os.unlink(tmpfile.name)

    try:
        comtypes.CoInitialize();
        wordapp = comtypes.client.CreateObject('Word.Application')
        doc = wordapp.Documents.Open(source, ReadOnly=True)
        doc.SaveAs(tmpname, FileFormat=16)
        doc.Close()
        wordapp.Quit()
    except:
        print sys.exc_info()

    if os.path.exists(tmpname):
        return tmpname
    else:
        return None
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

(<type 'exceptions.ValueError'>, ValueError('NULL COM pointer access',), <traceback object at 0x00000085CE65AC08>)
Run Code Online (Sandbox Code Playgroud)

在线的

doc = wordapp.Documents.Open(source, ReadOnly=True)
Run Code Online (Sandbox Code Playgroud)

但有趣的是,这个错误只在我使用 Web 界面时发生。也就是说,如果我通过 Apache 并调用此代码。

我试图直接从命令行运行此代码作为脚本,它工作得很好。

当转换作为 Django 视图的一部分发生时,我收到此错误。

提前致谢。

问候,

普拉塔梅什

小智 5

如果您仍然遇到此问题,这有助于我实现与 AWS(Win2012)-Apache(64bit)-Django 完全相同的布局:

更改 DCOM 配置设置:

  1. 开始 -> dcomcnfg.exe
  2. 计算机 -> 我的电脑
  3. DCOM 配置
  4. 选择Microsoft Word 97-2003 文档-> 属性
  5. 标签标识,从启动用户更改为交互式用户