Skip to content
Snippets Groups Projects
WatermarkController.php 5.88 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    
    /**
    * Copyright Maarch since 2008 under licence GPLv3.
    * See LICENCE.txt file at the root folder for more details.
    * This file is part of Maarch software.
    *
    */
    
    /**
    * @brief Watermark Controller
    * @author dev@maarch.org
    */
    
    namespace Resource\controllers;
    
    use Attachment\models\AttachmentModel;
    use Resource\models\ResModel;
    use setasign\Fpdi\Tcpdf\Fpdi;
    use SrcCore\models\CoreConfigModel;
    use SrcCore\models\ValidatorModel;
    
    class WatermarkController
    {
        public static function watermarkResource(array $args)
        {
            ValidatorModel::notEmpty($args, ['resId', 'path']);
            ValidatorModel::intVal($args, ['resId']);
            ValidatorModel::stringType($args, ['path']);
    
            $loadedXml = CoreConfigModel::getXmlLoaded(['path' => 'apps/maarch_entreprise/xml/features.xml']);
            if (empty($loadedXml)) {
                return null;
            }
    
            $watermark = (array)$loadedXml->FEATURES->watermark;
            if ($watermark['enabled'] != 'true') {
                return null;
            } elseif (empty($watermark['text'])) {
                return null;
            }
    
            $text = $watermark['text'];
            preg_match_all('/\[(.*?)\]/i', $watermark['text'], $matches);
            foreach ($matches[1] as $value) {
                if ($value == 'date_now') {
                    $tmp = date('d-m-Y');
                } elseif ($value == 'hour_now') {
                    $tmp = date('H:i');
                } else {
                    $resource = ResModel::getById(['select' => [$value], 'resId' => $args['resId']]);
                    $tmp = $resource[$value] ?? '';
                }
                $text = str_replace("[{$value}]", $tmp, $text);
            }
    
            $color = ['192', '192', '192']; //RGB
            if (!empty($watermark['text_color'])) {
                $rawColor = explode(',', $watermark['text_color']);
                $color = count($rawColor) == 3 ? $rawColor : $color;
            }
    
            $font = ['helvetica', '10']; //Familly Size
            if (!empty($watermark['font'])) {
                $rawFont = explode(',', $watermark['font']);
                $font = count($rawFont) == 2 ? $rawFont : $font;
            }
    
            $position = [30, 35, 0, 0.5]; //X Y Angle Opacity
            if (!empty($watermark['position'])) {
                $rawPosition = explode(',', $watermark['position']);
                $position = count($rawPosition) == 4 ? $rawPosition : $position;
            }
    
            try {
                $pdf = new Fpdi('P', 'pt');
                $nbPages = $pdf->setSourceFile($args['path']);
                $pdf->setPrintHeader(false);
                for ($i = 1; $i <= $nbPages; $i++) {
                    $page = $pdf->importPage($i, 'CropBox');
                    $size = $pdf->getTemplateSize($page);
                    $pdf->AddPage($size['orientation'], $size);
                    $pdf->useImportedPage($page);
                    $pdf->SetFont($font[0], '', $font[1]);
                    $pdf->SetTextColor($color[0], $color[1], $color[2]);
                    $pdf->SetAlpha($position[3]);
                    $pdf->Rotate($position[2]);
                    $pdf->Text($position[0], $position[1], $text);
                }
                $fileContent = $pdf->Output('', 'S');
            } catch (\Exception $e) {
                $fileContent = null;
            }
    
            return $fileContent;
        }
    
        public static function watermarkAttachment(array $args)
        {
            ValidatorModel::notEmpty($args, ['attachmentId', 'path']);
            ValidatorModel::intVal($args, ['attachmentId']);
            ValidatorModel::stringType($args, ['path']);
    
            $loadedXml = CoreConfigModel::getXmlLoaded(['path' => 'modules/attachments/xml/config.xml']);
            if (empty($loadedXml)) {
                return null;
            }
    
            $watermark = (array)$loadedXml->CONFIG->watermark;
            if ($watermark['enabled'] != 'true') {
                return null;
            } elseif (empty($watermark['text'])) {
                return null;
            }
    
            $text = $watermark['text'];
            preg_match_all('/\[(.*?)\]/i', $watermark['text'], $matches);
            foreach ($matches[1] as $value) {
                if ($value == 'date_now') {
                    $tmp = date('d-m-Y');
                } elseif ($value == 'hour_now') {
                    $tmp = date('H:i');
                } else {
                    $attachment = AttachmentModel::getById(['select' => [$value], 'id' => $args['attachmentId']]);
                    $tmp = $attachment[$value] ?? '';
                }
                $text = str_replace("[{$value}]", $tmp, $text);
            }
    
            $color = ['192', '192', '192']; //RGB
            if (!empty($watermark['text_color'])) {
                $rawColor = explode(',', $watermark['text_color']);
                $color = count($rawColor) == 3 ? $rawColor : $color;
            }
    
            $font = ['helvetica', '10']; //Familly Size
            if (!empty($watermark['font'])) {
                $rawFont = explode(',', $watermark['font']);
                $font = count($rawFont) == 2 ? $rawFont : $font;
            }
    
            $position = [30, 35, 0, 0.5]; //X Y Angle Opacity
            if (!empty($watermark['position'])) {
                $rawPosition = explode(',', $watermark['position']);
                $position = count($rawPosition) == 4 ? $rawPosition : $position;
            }
    
            try {
                $pdf = new Fpdi('P', 'pt');
                $nbPages = $pdf->setSourceFile($args['path']);
                $pdf->setPrintHeader(false);
                for ($i = 1; $i <= $nbPages; $i++) {
                    $page = $pdf->importPage($i, 'CropBox');
                    $size = $pdf->getTemplateSize($page);
                    $pdf->AddPage($size['orientation'], $size);
                    $pdf->useImportedPage($page);
                    $pdf->SetFont($font[0], '', $font[1]);
                    $pdf->SetTextColor($color[0], $color[1], $color[2]);
                    $pdf->SetAlpha($position[3]);
                    $pdf->Rotate($position[2]);
                    $pdf->Text($position[0], $position[1], $text);
                }
                $fileContent = $pdf->Output('', 'S');
            } catch (\Exception $e) {
                $fileContent = null;
            }
    
            return $fileContent;
        }
    }