Files
test/jikimo_printing/models/jikimo_printing.py
2025-04-28 19:18:02 +08:00

143 lines
5.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
# 检查输入数据类型
# _logger.info(f"输入数据类型: {type(pdf_data)}")
# # 如果数据是bytes类型但看起来是base64编码先解码一次
# if isinstance(pdf_data, bytes) and pdf_data[:10].decode('ascii', errors='ignore').isalnum():
# try:
# # 尝试将bytes转为字符串后解码
# pdf_data_str = pdf_data.decode('ascii', errors='ignore')
# decoded_data = base64.b64decode(pdf_data_str)
# _logger.info(f"对bytes类型的base64数据进行解码解码后前20字节: {decoded_data[:20]}")
# # 检查是否是PDF格式
# if decoded_data[:4] == b'%PDF':
# _logger.info("解码后得到PDF格式数据")
# pdf_data = decoded_data
# except Exception as e:
# _logger.error(f"base64解码bytes数据失败: {str(e)}")
# # 常规的数据处理
# if isinstance(pdf_data, str):
# _logger.info("输入数据是字符串类型")
# try:
# decoded_data = base64.b64decode(pdf_data)
# _logger.info(f"成功解码base64数据解码后前20字节: {decoded_data[:20]}")
# except Exception as e:
# _logger.error(f"base64解码失败: {str(e)}")
# decoded_data = pdf_data.encode()
# else:
# _logger.info("处理bytes类型数据")
# decoded_data = pdf_data
# # 检查解码后数据是否为PDF格式
# is_pdf = False
# try:
# if decoded_data[:4] == b'%PDF':
# is_pdf = True
# _logger.info("数据是PDF格式")
# else:
# _logger.info(f"数据不是PDF格式前20字节: {decoded_data[:20]}")
# # 最后尝试直接以base64解码
# try:
# final_try = base64.b64decode(decoded_data)
# if final_try[:4] == b'%PDF':
# _logger.info("最后尝试解码成功")
# decoded_data = final_try
# is_pdf = True
# except:
# _logger.info("最后尝试解码失败")
# except Exception as e:
# _logger.error(f"检查PDF格式时出错: {str(e)}")
# 处理二进制数据
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
# 使用正确的格式打印
# try:
# if is_pdf:
# _logger.info("使用PDF格式打印")
printer.print_document(report=None, content=pdf_content, doc_format='pdf')
# else:
# _logger.info("使用RAW格式打印")
# printer.print_document(report=None, content=pdf_content, doc_format='raw')
# except Exception as e:
# _logger.error(f"打印时出错: {str(e)}")
# 清理资源
pdf_buffer.close()
_logger.info("PDF打印结束")