diff --git a/hr_expense_report_merge_attachment/controllers/main.py b/hr_expense_report_merge_attachment/controllers/main.py index 89ecf0d..b666aab 100644 --- a/hr_expense_report_merge_attachment/controllers/main.py +++ b/hr_expense_report_merge_attachment/controllers/main.py @@ -9,6 +9,11 @@ from odoo import http from reportlab.pdfgen import canvas from reportlab.lib.utils import ImageReader from reportlab.lib.pagesizes import letter, A4 +try: + from pillow_heif import register_heif_opener + register_heif_opener() +except ImportError: + pass logger = logging.getLogger(__name__) @@ -50,14 +55,25 @@ class Extension(main.ReportController): except PyPDF2.utils.PdfReadError: # Case of non-pdf attachments logger.info('Attachment %s cannot be merged in expense report'%(att.name,)) elif 'image/' in att.mimetype: - packet = io.BytesIO() - can = canvas.Canvas(packet) - img = ImageReader(io.BytesIO(base64.b64decode(att.datas))) - can.drawImage(img, 0, 0, A4[0]*0.9, A4[1]*0.9, preserveAspectRatio=True) - can.save() - packet.seek(0) - attachment_reader = OdooPdfFileReader(packet) - writer.addPage(attachment_reader.getPage(0)) + try: + from PIL import Image as PilImage + raw = base64.b64decode(att.datas) + pil_img = PilImage.open(io.BytesIO(raw)) + if pil_img.mode not in ('RGB', 'RGBA'): + pil_img = pil_img.convert('RGB') + jpeg_buffer = io.BytesIO() + pil_img.save(jpeg_buffer, format='JPEG') + jpeg_buffer.seek(0) + packet = io.BytesIO() + can = canvas.Canvas(packet) + img = ImageReader(jpeg_buffer) + can.drawImage(img, 0, 0, A4[0]*0.9, A4[1]*0.9, preserveAspectRatio=True) + can.save() + packet.seek(0) + attachment_reader = OdooPdfFileReader(packet) + writer.addPage(attachment_reader.getPage(0)) + except Exception: + logger.info('Attachment %s cannot be merged in expense report', att.name) # Write new pdf to res.data buffer = io.BytesIO() @@ -66,4 +82,4 @@ class Extension(main.ReportController): res.data = pdf_content - return res \ No newline at end of file + return res