2014-10-18 51 views
0

我试图使用Django模板渲染存储在Google驱动器中的word文档文件(docx)的内容。文档文件(docx)是包含django变量的模板。 转换文件到Google文档格式将让的docx文件失去其字体和样式格式因此,我想实现在谷歌应用程序引擎以下步骤在Google App Engine中将docx文件渲染为django模板

  1. 使用由谷歌公司downloadUrl驱动
  2. 下载的docx文件
  3. 传递下载的文件到Python,DOCX模块提取文本
  4. 传递提取到Django的文字为它使用Python,DOCX
  5. 最后呈现的Django变量
  6. 写的文字回DOCX UPL将docx文件添加到另一个Google Drive帐户。

我有试图通过下载的文件到蟒蛇,DOCX问题,实现here
下面是我在谷歌应用程序引擎代码

downloadUrl = searchResult.get('items')[1]['downloadUrl'] 
    if downloadUrl: 
     resp, tempContent = drive_service._http.request(downloadUrl) 
     if resp.status == 200: 
     f = StringIO.StringIO(tempContent) 
     document = Document(f) 
     para = document.paragraphs() 
     print para 
     f.close() 

上面的代码提供了以下错误:

 para = document.paragraphs() 
     TypeError: 'list' object is not callable 

这是我的代码,用于在Django模板中渲染提取的文本

 myTemplate = Template(tempContent) 
     c = Context({ 
        "salutation": "William", 
        "inventionTitle":"Biometric KeyLock" 
        }) 
     fullContent = myTemplate.render(c) 

已下载文件的MIME类型是:

application/vnd.openxmlformatsofficedocument.wordprocessingml.document

我的问题是,我不知道如何处理下载的文件。我想要替换存储在谷歌驱动器中的word docx中的占位符/变量,而不会丢失格式,然后将其上传回谷歌驱动器。

如果有更好的实现方法,请让我知道。

谢谢。

+0

错误消息告诉你所有你需要知道的:'document.paragraphs'不是一个方法,不要试图调用它。但是在完成这项工作之前,您将需要更多的工作来完成修复任务:就在我头顶,您如何期望将数据恢复到正确位置的word文档中? – 2014-10-18 20:52:04

+0

感谢丹尼尔,但根据文档 >>> 高清段(个体经营): “”” A的名单|段落|对应段落 的文档实例文档顺序需要注意的是段落内修订 标记,如''''或''''没有出现在这个名单 “”” 回报self._document_part.paragraphs' – 2014-10-21 13:04:58

+0

链接为[蟒蛇-的docx(HTTPS文件:// python-docx.readthedocs.org/en/latest/_modules/docx/api.html#Document.paragraphs) – 2014-10-21 13:20:02

回答

0

这样的错误......

TypeError: 'list' object is not callable 

...一般意味着你有一个列表([]),这是不是一个可调用对象,这意味着你不能把括号后调用它:

>>> []() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'list' object is not callable 

这可能是因为该对象是你想要的数据有效载荷。尝试删除括号,让我们知道你得到什么!

para = document.paragraphs 

每个段落都可能是一个可以操作的对象,即合并/呈现Django/Jinja2模板带上下文等。例如,如果你想要的文字,你可能有.text提取它,在指定的Paragraph object docs page

for para in document.paragraphs: 
    print(para.text) 

我没有与Python-DOCX经验,但如果你可以它会很酷只是这样做:

for para in document.paragraphs: 
    myTemplate = Template(para.text) 
    c = Context({ 
       "salutation": "William", 
       "inventionTitle":"Biometric KeyLock" 
       }) 
    para.text = myTemplate.render(c) 

然而,在现实中,这可能不会飞,因为你很可能会有不同的文本格式,在短短一个段落,这意味着你可能会需要启动调查“”,具有一组共同属性的文本区域。另请参阅docs page on Runs

要保留格式,您可能必须查看整个文档并对模板变量执行单独的搜索替换。虽然此问题不涉及Google Slides API,但其文本在文档中的结构方式类似于Google文档&,因此它的text concepts guide可能是有用的参考。

最后,Drive API v2不再是最新的API版本。现在在v3现在downloadUrl已弃用。要查看替代方案,请检查Drive API v2-v3 migration guide。要查看一些您可能会使用的实际v3代码,并且只需调整source & destination MIMEtypes,请查看我的“将CSV表格导出为CSV”blog post