我使用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
答案 0 :(得分:2)
documentation here解释了add_picture()
方法将文件作为参数。该文件可以是路径的形式,也可以是类文件对象,例如打开文件或StringIO
对象。它不能接受包含图像字节的字节串,这是您尝试过的。
因此,您需要将图像字节转换为类似文件的对象,可能使用StringIO(),并将生成的类文件对象传递给add_picture()
。这将使它适合你。类似的东西:
logo_file = StringIO(base64.b64decode(r[1]))
doc.add_picture(logo_file)