59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
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
|
|
"""
|
|
if isinstance(pdf_data, str):
|
|
pdf_data = pdf_data.encode()
|
|
|
|
printer = self.env['printing.printer'].get_default()
|
|
printer.print_document(report=None, content = pdf_data, doc_format='pdf') |