from io import BytesIO import qrcode from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4 from PIL import Image from reportlab.lib.utils import ImageReader from odoo import models, fields, api class JikimoPrinting(models.AbstractModel): _name = 'jikimo.printing' def print_qr_code(self, data): """ 打印二维码 """ # 生成二维码 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() printer = self.env['printing.printer'].get_default() printer.print_document(report=None, content=pdf_content, doc_format='pdf') # 清理资源 pdf_buffer.close() temp_image.close() def print_pdf(self, pdf_data): """ 打印PDF """ printer = self.env['printing.printer'].get_default() printer.print_document(report=None, content = pdf_data, doc_format='pdf')