【问题标题】:Insert image encoded in base 64 in a word document with python-docx?使用python-docx在word文档中插入以base 64编码的图像?
【发布时间】:2015-10-01 05:11:03
【问题描述】:

我使用 python-docx 来生成 word 文档。用户希望他创建一个模板(在字段描述中),并且当他在模板中编写例如 %(company_logo)s 时,我将这个表达式替换为我从数据库中恢复的公司图片。 作为第一个问题,我从数据库(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)

输出是一个文档单词,其中包含图像的 base 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

【问题讨论】:

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


    【解决方案1】:

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

    因此,您需要将图像字节转换为类似文件的对象,可能使用 StringIO(),然后将生成的类似文件的对象交给add_picture()。这会让它为你工作。比如:

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

    【讨论】:

    • 你好,scanny,可以用 add_picture() 添加如下: f_logo_company = open("logo_company.png", "w") f_logo_company.write(logo_company) f_logo_company.close() 和之后我们使用 doc.add_picture('logo_company.png',width=Inches(1.0)) 但问题是我不能将它插入到特定位置我只能将它添加到文档中。请记住,我有一个字段类型文本,当用户在此字段中写入 %(company_logo)s 时,我应该将其替换为徽标。而且我不能使用表格,因为它只是一个字段。
    • 是的,很遗憾,当前版本无法添加“内嵌”图片,只能在当前文档末尾的自己的段落中添加一个。如果您想内联添加图像,则需要开发该功能,可能使用add_picture() 的实现作为指导。
    • 谢谢你的回答,我会努力开发的
    猜你喜欢
    • 2019-02-16
    • 2017-01-07
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    相关资源
    最近更新 更多