使用python-docx将以base 64编码的图像插入到word文档中?

时间:2015-09-29 14:41:40

标签: postgresql python-2.7 base64 openerp-7 python-docx

我使用python-docx生成word文档。用户希望他创建一个模板(在字段描述中),当他在模板中编写例如%(company_logo)时,我将这个表达式替换为我从数据库中恢复的公司的图片。 作为第一个问题,我从数据库(Postgresql)中恢复了公司的徽标,并使用此代码替换此表达式:

    cr.execute("select name, logo_web from res_company where id=%s",[soc_id])
    r=cr.fetchone()
    if r :
        company_name=r[0]
        logo_company = r[1]


    output = cStringIO.StringIO()
    doc = docx.Document()

    contenu=contenu % {'company_logo': logo_company, 'company_name': company_name,}
    doc.add_paragraph(contenu)

输出是一个文档单词,其中包含图像的基本64代码作为字符串。我解码了这段代码,并尝试将其添加为带有以下代码的图片:

logo_company = base64.b64decode(r[1])
doc.add_picture(logo_company)

但我有这个错误告诉我,参数必须是图片的路径。

TypeError: file() argument 1 must be encoded string without NULL bytes, not str

1 个答案:

答案 0 :(得分:2)

documentation here解释了add_picture()方法将文件作为参数。该文件可以是路径的形式,也可以是类文件对象,例如打开文件或StringIO对象。它不能接受包含图像字节的字节串,这是您尝试过的。

因此,您需要将图像字节转换为类似文件的对象,可能使用StringIO(),并将生成的类文件对象传递给add_picture()。这将使它适合你。类似的东西:

logo_file = StringIO(base64.b64decode(r[1]))
doc.add_picture(logo_file)