diff --git a/core/log.class.inc.php b/core/log.class.inc.php index b8a2d358e..9aa63943e 100644 --- a/core/log.class.inc.php +++ b/core/log.class.inc.php @@ -544,13 +544,6 @@ class LogChannels { public const APC = 'apc'; - /** - * @var string - * @since 3.0.1 N°4849 - * @since 2.7.7 N°4635 - */ - public const NOTIFICATIONS = 'notifications'; - /** * @var string Everything related to the backup / restore * @since 3.1.0 @@ -584,8 +577,21 @@ class LogChannels public const DEADLOCK = 'DeadLock'; + /** + * @var string + * @since 2.7.9 3.0.3 3.1.0 N°5588 + */ + public const EXPORT = 'export'; + public const INLINE_IMAGE = 'InlineImage'; + /** + * @var string + * @since 3.0.1 N°4849 + * @since 2.7.7 N°4635 + */ + public const NOTIFICATIONS = 'notifications'; + public const PORTAL = 'portal'; /** diff --git a/core/pdfbulkexport.class.inc.php b/core/pdfbulkexport.class.inc.php index 6794f3419..e4f0f230d 100644 --- a/core/pdfbulkexport.class.inc.php +++ b/core/pdfbulkexport.class.inc.php @@ -223,28 +223,33 @@ EOF // As sample data will be displayed in the web browser, AttributeImage needs to be rendered with a regular HTML format, meaning its "src" looking like "data:image/png;base64,iVBORw0KGgoAAAANSUh..." // Whereas for the PDF generation it needs to be rendered with a TCPPDF-compatible format, meaning its "src" looking like "@iVBORw0KGgoAAAANSUh..." if ($oAttDef instanceof AttributeImage) { - return $this->GetAttributeImageValue($oAttDef, $oObj->Get($sAttCode), static::ENUM_OUTPUT_TYPE_SAMPLE); + return $this->GetAttributeImageValue($oObj, $sAttCode, static::ENUM_OUTPUT_TYPE_SAMPLE); } } return parent::GetSampleData($oObj, $sAttCode); } + /** + * @param \DBObject $oObj + * @param string $sAttCode + * + * @return int|string + * @throws \Exception + */ protected function GetValue($oObj, $sAttCode) { - switch($sAttCode) - { + switch ($sAttCode) { case 'id': $sRet = parent::GetValue($oObj, $sAttCode); break; default: $value = $oObj->Get($sAttCode); - if ($value instanceof ormDocument) - { + if ($value instanceof ormDocument) { $oAttDef = MetaModel::GetAttributeDef(get_class($oObj), $sAttCode); if ($oAttDef instanceof AttributeImage) { - $sRet = $this->GetAttributeImageValue($oAttDef, $value, static::ENUM_OUTPUT_TYPE_REAL); + $sRet = $this->GetAttributeImageValue($oObj, $sAttCode, static::ENUM_OUTPUT_TYPE_REAL); } else { @@ -260,15 +265,22 @@ EOF } /** - * @param \AttributeImage $oAttDef Instance of image attribute - * @param \ormDocument $oValue Value of image attribute + * @param \DBObject $oObj + * @param string $sAttCode * @param string $sOutputType {@see \PDFBulkExport::ENUM_OUTPUT_TYPE_SAMPLE}, {@see \PDFBulkExport::ENUM_OUTPUT_TYPE_REAL} * * @return string Rendered value of $oAttDef / $oValue according to the desired $sOutputType - * @since 2.7.8 + * @throws \ArchivedObjectException + * @throws \CoreException + * + * @since 2.7.8 N°2244 method creation + * @since 2.7.9 N°5588 signature change to get the object so that we can log all the needed information */ - protected function GetAttributeImageValue(AttributeImage $oAttDef, ormDocument $oValue, string $sOutputType) + protected function GetAttributeImageValue(DBObject $oObj, string $sAttCode, string $sOutputType) { + $oValue = $oObj->Get($sAttCode); + $oAttDef = MetaModel::GetAttributeDef(get_class($oObj), $sAttCode); + // To limit the image size in the PDF output, we have to enforce the size as height/width because max-width/max-height have no effect // $iDefaultMaxWidthPx = 48; @@ -279,13 +291,27 @@ EOF $sUrl = $oAttDef->Get('default_image'); } else { - list($iWidth, $iHeight) = utils::GetImageSize($oValue->GetData()); $iMaxWidthPx = min($iDefaultMaxWidthPx, $oAttDef->Get('display_max_width')); $iMaxHeightPx = min($iDefaultMaxHeightPx, $oAttDef->Get('display_max_height')); - $fScale = min($iMaxWidthPx / $iWidth, $iMaxHeightPx / $iHeight); - $iNewWidth = $iWidth * $fScale; - $iNewHeight = $iHeight * $fScale; + list($iWidth, $iHeight) = utils::GetImageSize($oValue->GetData()); + if ((is_null($iWidth)) || (is_null($iHeight)) || ($iWidth === 0) || ($iHeight === 0)) { + // Avoid division by zero exception (SVGs, corrupted images, ...) + $iNewWidth = $iDefaultMaxWidthPx; + $iNewHeight = $iDefaultMaxHeightPx; + + $sAttCode = $oAttDef->GetCode(); + IssueLog::Warning('AttributeImage: Cannot read image size', LogChannels::EXPORT, [ + 'ObjClass' => get_class($oObj), + 'ObjKey' => $oObj->GetKey(), + 'ObjFriendlyName' => $oObj->GetName(), + 'AttCode' => $sAttCode, + ]); + } else { + $fScale = min($iMaxWidthPx / $iWidth, $iMaxHeightPx / $iHeight); + $iNewWidth = $iWidth * $fScale; + $iNewHeight = $iHeight * $fScale; + } $sValueAsBase64 = base64_encode($oValue->GetData()); switch ($sOutputType) {