Accept Merge Request #2082: (feature/6694 -> develop)

Merge Request: 增加打印日志

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2082?initial=true
This commit is contained in:
胡尧
2025-04-28 18:28:49 +08:00
committed by Coding
3 changed files with 89 additions and 5 deletions

View File

@@ -6,6 +6,7 @@ from PIL import Image
import logging
from reportlab.lib.utils import ImageReader
from odoo import models, fields, api
import base64
_logger = logging.getLogger(__name__)
@@ -55,7 +56,85 @@ class JikimoPrinting(models.AbstractModel):
def print_pdf(self, pdf_data):
"""
打印PDF
"""
"""
_logger.info("PDF打印开始")
# 检查输入数据类型
_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()
_logger.info(f"打印内容: {pdf_data}")
printer.print_document(report=None, content = pdf_data, doc_format='pdf')
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打印结束")

View File

@@ -19,6 +19,7 @@ class MrpWorkorder(models.Model):
if pdf_data:
try:
# 执行打印
_logger.info(f"准备打印工单 {wo.name} 的PDF")
self.env['jikimo.printing'].print_pdf(pdf_data)
wo.production_id.product_id.is_print_program = True
_logger.info(f"工单 {wo.name} 的PDF已成功打印")

View File

@@ -1,3 +1,7 @@
pystrich
cpca
pycryptodome==3.20
cpca==0.5.5
wechatpy==1.8.18
pycryptodome==3.22.0
openupgradelib==3.10.0
opcua==0.98.13
openpyxl