在Google App Engine中将docx文件渲染为django模板

时间:2014-10-18 19:14:25

标签: python django google-app-engine ms-word django-templates

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

  1. 使用google drive的downloadUrl下载docx文件
  2. 将下载的文件传递到python-docx模块以提取文本
  3. 将提取的文本传递给Django,以便呈现Django变量
  4. 使用python-docx
  5. 将文本写回docx
  6. 最后将docx文件上传到另一个google云端硬盘帐户。
  7. 我在尝试将下载的文件传递到python-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)
    

    下载文件的mimetype为:

      

    应用/ vnd.openxmlformatsofficedocument.wordprocessingml.document

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

    如果有更好的方法可以实现这一点,请告诉我。

    谢谢。

1 个答案:

答案 0 :(得分: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模板w / context等。例如,如果你想要文本,你可能需要用{{1}来提取它。 },如Paragraph object docs page

中所述
.text

我没有使用python-docx的经验,但是如果你能做这样的事情会很酷:

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

然而,实际上,这可能不会飞,因为您可能只在一个段落中有各种文本格式,这意味着您可能需要开始调查&# 34; runs,&#34;具有一组共同属性的文本区域。另请参阅docs page on Runs

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

最后,Drive API v2不再是最新的API版本。它现在位于v3,现在不推荐使用for para in document.paragraphs: myTemplate = Template(para.text) c = Context({ "salutation": "William", "inventionTitle":"Biometric KeyLock" }) para.text = myTemplate.render(c) 。要查看替代方案,请查看Drive API v2-v3 migration guide。要查看您可能会使用的一些实际v3代码,只需调整source & destination MIMEtypes,请查看我的&#34;将Google表格文件导出为CSV&#34; blog post