from io import BytesIO import qrcode from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4 from PIL import Image import logging from reportlab.lib.utils import ImageReader from odoo import models, fields, api import base64 _logger = logging.getLogger(__name__) class JikimoPrinting(models.AbstractModel): _name = 'jikimo.printing' def print_qr_code(self, data): """ 打印二维码 """ printer = self.env['printing.printer'].get_default() if not printer: _logger.error("未找到默认打印机") return False # 生成二维码 qr = qrcode.QRCode(version=1, box_size=10, border=5) qr.add_data(data) qr.make(fit=True) qr_image = qr.make_image(fill_color="black", back_color="white") # 将PIL Image转换为reportlab可用的格式 temp_image = BytesIO() qr_image.save(temp_image, format="PNG") temp_image.seek(0) # 创建PDF pdf_buffer = BytesIO() c = canvas.Canvas(pdf_buffer, pagesize=A4) # 计算位置 a4_width, a4_height = A4 qr_width = 200 qr_height = 200 x = (a4_width - qr_width) / 2 y = (a4_height - qr_height) / 2 # 直接从BytesIO绘制图片 c.drawImage(ImageReader(Image.open(temp_image)), x, y, width=qr_width, height=qr_height) c.save() # 获取PDF内容并打印 pdf_content = pdf_buffer.getvalue() # _logger.info(f"打印内容: {pdf_content}") printer.print_document(report=None, content=pdf_content, doc_format='pdf') # 清理资源 pdf_buffer.close() temp_image.close() return True def print_pdf(self, pdf_data): """ 打印PDF """ printer = self.env['printing.printer'].get_default() if not printer: _logger.error("未找到默认打印机") return False pdf_data_str = pdf_data.decode('ascii', errors='ignore') decoded_data = base64.b64decode(pdf_data_str) # 处理二进制数据 pdf_buffer = BytesIO() pdf_buffer.write(decoded_data) pdf_buffer.seek(0) # 获取PDF内容 pdf_content = pdf_buffer.getvalue() printer.print_document(report=None, content=pdf_content, doc_format='pdf') # 清理资源 pdf_buffer.close() _logger.info("成功打印PDF") return True