2015-07-21 56 views
3

是否有人使用openERP/odoo通過XML-RPC打印發票。我一直在試圖創建一個xml rpc方法來打印沒有成功。如何通過XML-RPC從odoo/openERP打印

function printInvoice($values,$model){ 

     $print = new xmlrpc_client($this->server."report"); 
     $print->return_type = 'phpvals'; 

     foreach($values as $k=>$v){ 
      $nval[$k] = new xmlrpcval($v, xmlrpc_get_type($v)); 
     } 

     $msg = new xmlrpcmsg('report'); 

     $msg->addParam(new xmlrpcval($this->database, "string")); 
     $msg->addParam(new xmlrpcval($this->uid, "int")); 
     $msg->addParam(new xmlrpcval($this->password, "string")); 
     $msg->addParam(new xmlrpcval($model, "string")); 
     $msg->addParam(new xmlrpcval("report", "string")); 
     $msg->addParam(new xmlrpcval(87, "int")); 
     $msg->addParam(new xmlrpcval($nval,"struct")); 

     $resp = $print->send($msg); 



     if ($resp->faultCode()) 
      return $resp->faultString(); 
     else 
      return $resp->value(); 

    } 

這是我到目前爲止的代碼,首先我要生成一個報告,然後打印出來的。

回答

2

我想出了一個簡單的方法來做到這一點,您只需在鏈接中傳遞發票或訂單的ID,併爲報告動態創建PDF,或者使用生成的PDF代替PDF準備打印發票的HTML如下:

http://serverurl:port/report/html /account.report_invoice/(發票的編號);

這是代碼,如果它可以幫助某人。

function printInvoice($id,$type){ 


      if($type == 'invoice') 
      { 
       return "http://serverurl:port/report/pdf/account.report_invoice/".$id; 
      } 
      else if($type == 'order') 
      { 
       return "http://serverurl:port/report/pdf/sale.report_saleorder/".$id; 
      } 
      else 
      { 
       return false; 
      } 
     } 
+0

這種方式對於javascript客戶端來說很簡單,因爲它已經創建了一個會話。 但是,當從外部Cookie與:session_id缺少。服務器拒絕該請求。任何想法如何得到它? – yucer

0

在蟒蛇...

import time 
import base64 

printsock = xmlrpclib.ServerProxy('http://server:8069/xmlrpc/report') 
model = 'account.invoice' 
id_report = printsock.report(dbname, uid, pwd, model, ids, {'model': model, 'id': ids[0], 'report_type':'pdf'}) 
time.sleep(5) 
state = False 
attempt = 0 
while not state: 
    report = printsock.report_get(dbname, uid, pwd, id_report) 
    state = report['state'] 
    if not state: 
     time.sleep(1) 
    attempt += 1 
    if attempt>200: 
     print 'Printing aborted, too long delay !' 

    string_pdf = base64.decodestring(report['result']) 
    file_pdf = open('/tmp/file.pdf','w') 
    file_pdf.write(string_pdf) 
    file_pdf.close() 
2

有SESSION_ID丟失時的作品,甚至另一種方式。你應該在服務器端添加一個返回pdf的函數:

from openerp import models, api 
from openerp.http import request 


class AccountInvoice(models.Model): 
    _inherit = 'account.invoice' 

    @api.multi 
    def json_pdf(self): 
     request.website_multilang = False 

     pdf = self.env['report'].get_pdf(self, 'account.report_invoice') 
     if pdf: 
      return {'data': pdf.encode('base64'), 'name': self.number} 
     else: 
      return {'error': 'Attachment not found', 'name': self.number}