2015-09-29 87 views
2

我使用python-docx來生成word文檔。用戶希望他創建一個模板(在字段描述中),當他在模板中寫入例如%(company_logo)時,我用從數據庫恢復的公司圖片替換此表達式。 作爲第一問題,我recupered一個公司的標誌從數據庫(PostgreSQL系統)和I使用此代碼來替換此表達式:使用python-docx插入以64位編碼的圖像到word文檔中?

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 

回答

2

documentation here的解釋說,add_picture()方法以一個文件作爲參數。該文件可以是路徑的形式,也可以是類似文件的對象,例如打開的文件或對象。它不能接受包含圖像字節的字節串,這是你試圖做的。

因此,您需要將圖像字節轉換爲類似文件的對象(可能使用StringIO()),並將生成的文件類對象交給add_picture()。這會讓你的工作。喜歡的東西:

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

你好scanny,它可以與add_picture()像下面添加:f_logo_company =打開( 「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時,我應該用logo替換它。而且我不能使用表格,因爲它只是一個字段。 –

+0

是的,不幸的是,當前版本不能添加「內聯」圖片,它只能在當前文檔的末尾添加一個自己的段落。如果你想添加一個內聯圖像,你需要開發這個功能,或許使用'add_picture()'的實現作爲指導。 – scanny

+0

謝謝你的回答,我會盡力開發它 –