diff --git a/jikimo_printing/models/jikimo_printing.py b/jikimo_printing/models/jikimo_printing.py index 32ff5474..0bb02215 100644 --- a/jikimo_printing/models/jikimo_printing.py +++ b/jikimo_printing/models/jikimo_printing.py @@ -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') \ No newline at end of file + 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打印结束") \ No newline at end of file diff --git a/jikimo_printing/models/workorder_printing.py b/jikimo_printing/models/workorder_printing.py index 97c857ca..4c96ad60 100644 --- a/jikimo_printing/models/workorder_printing.py +++ b/jikimo_printing/models/workorder_printing.py @@ -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已成功打印") diff --git a/requirements.txt b/requirements.txt index dd3bbd58..5aabe0ef 100644 --- a/requirements.txt +++ b/requirements.txt @@ -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 \ No newline at end of file