[FIX] hr_expense_report_merge_attachment: handle HEIC images uploaded as JPEG #19

Open
stephansainleger wants to merge 1 commits from 14.0-heif into 14.0
Showing only changes of commit fb7ff241f5 - Show all commits

View File

@@ -9,6 +9,11 @@ from odoo import http
from reportlab.pdfgen import canvas from reportlab.pdfgen import canvas
from reportlab.lib.utils import ImageReader from reportlab.lib.utils import ImageReader
from reportlab.lib.pagesizes import letter, A4 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__) logger = logging.getLogger(__name__)
@@ -50,14 +55,25 @@ class Extension(main.ReportController):
except PyPDF2.utils.PdfReadError: # Case of non-pdf attachments except PyPDF2.utils.PdfReadError: # Case of non-pdf attachments
logger.info('Attachment %s cannot be merged in expense report'%(att.name,)) logger.info('Attachment %s cannot be merged in expense report'%(att.name,))
elif 'image/' in att.mimetype: elif 'image/' in att.mimetype:
packet = io.BytesIO() try:
can = canvas.Canvas(packet) from PIL import Image as PilImage
img = ImageReader(io.BytesIO(base64.b64decode(att.datas))) raw = base64.b64decode(att.datas)
can.drawImage(img, 0, 0, A4[0]*0.9, A4[1]*0.9, preserveAspectRatio=True) pil_img = PilImage.open(io.BytesIO(raw))
can.save() if pil_img.mode not in ('RGB', 'RGBA'):
packet.seek(0) pil_img = pil_img.convert('RGB')
attachment_reader = OdooPdfFileReader(packet) jpeg_buffer = io.BytesIO()
writer.addPage(attachment_reader.getPage(0)) 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 # Write new pdf to res.data
buffer = io.BytesIO() buffer = io.BytesIO()
@@ -66,4 +82,4 @@ class Extension(main.ReportController):
res.data = pdf_content res.data = pdf_content
return res return res