143 lines
5.2 KiB
Python
143 lines
5.2 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)
|
||
|
||
# 检查输入数据类型
|
||
# _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打印结束") |