83 lines
2.5 KiB
Python
83 lines
2.5 KiB
Python
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):
|
|
"""
|
|
打印二维码
|
|
"""
|
|
# 生成二维码
|
|
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()
|
|
_logger.info(f"打印内容: {pdf_content}")
|
|
printer.print_document(report=None, content=pdf_content, doc_format='pdf')
|
|
|
|
# 清理资源
|
|
pdf_buffer.close()
|
|
temp_image.close()
|
|
|
|
def print_pdf(self, pdf_data):
|
|
"""
|
|
打印PDF
|
|
"""
|
|
_logger.info("PDF打印开始")
|
|
|
|
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()
|
|
_logger.info(f"处理后的内容前20字节: {pdf_content[:20]}")
|
|
|
|
# 获取默认打印机
|
|
printer = self.env['printing.printer'].get_default()
|
|
if not printer:
|
|
_logger.error("未找到默认打印机")
|
|
return
|
|
|
|
printer.print_document(report=None, content=pdf_content, doc_format='pdf')
|
|
# 清理资源
|
|
pdf_buffer.close()
|
|
_logger.info("PDF打印结束") |