Skip to content
Snippets Groups Projects
WatermarkController.php 5.18 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 Document\controllers;
    
    use Document\models\DocumentModel;
    use setasign\Fpdi\Tcpdf\Fpdi;
    use SrcCore\models\CoreConfigModel;
    use SrcCore\models\ValidatorModel;
    
    class WatermarkController
    {
        public static function watermarkDocument(array $args)
        {
            ValidatorModel::notEmpty($args, ['config', 'encodedDocument', 'id']);
            ValidatorModel::intVal($args, ['id']);
            ValidatorModel::stringType($args, ['encodedDocument']);
            ValidatorModel::arrayType($args, ['config']);
    
            $watermark = $args['config'];
    
    
            if (empty($watermark['enabled']) || empty($watermark['text'])) {
    
                return null;
            }
    
            $mainDocument = DocumentModel::getById(['select' => ['*'] ,'id' => $args['id']]);
            $mainDocument['metadata'] = json_decode($mainDocument['metadata'], true);
    
            foreach ($mainDocument['metadata'] as $key => $metadatum) {
                $mainDocument['metadata.' . $key] = $metadatum;
            }
            unset($mainDocument['metadata']);
    
            $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 {
                    $tmp = $mainDocument[$value] ?? '';
                }
                $text = str_replace("[{$value}]", $tmp, $text);
            }
    
    
            $libPath = CoreConfigModel::getFpdiPdfParserLibrary();
            if (file_exists($libPath)) {
                require_once($libPath);
    
                $watermarkFile = CoreConfigModel::getTmpPath() . "tmp_file_{$GLOBALS['id']}_" .rand(). "_watermark.pdf";
                file_put_contents($watermarkFile, base64_decode($args['encodedDocument']));
    
    
                $isSigned = WatermarkController::checkDocumentSignatureField(['encodedDocument' => $args['encodedDocument']]);
                if(!empty($isSigned)) {
                    return $fileContent;
                }
    
    
                $libPath = CoreConfigModel::getSetaPdfFormFillerLibrary();
                if (!empty($libPath)) {
                    require_once($libPath);
    
                    $flattenedFile = CoreConfigModel::getTmpPath() . "tmp_file_{$GLOBALS['id']}_" .rand(). "_watermark.pdf";
                    $writer = new \SetaPDF_Core_Writer_File($flattenedFile);
                    $document = \SetaPDF_Core_Document::loadByFilename($watermarkFile, $writer);
    
                    $formFiller = new \SetaPDF_FormFiller($document);
                    $fields = $formFiller->getFields();
                    $fields->flatten();
                    $document->save()->finish();
    
                    $watermarkFile = $flattenedFile;
                }
    
    
                $pdf = new Fpdi('P', 'pt');
                $nbPages = $pdf->setSourceFile($watermarkFile);
                $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('courier', '', 8); // Size 8
                    $pdf->SetTextColor(0, 0, 0); // Color black
                    $pdf->SetAlpha(0.5); // Opacity
                    $pdf->Rotate(0); // No rotation
    
                    $pdf->Text(8, $watermark['posY'], $text, false, false, true, 0, 0, $watermark['align']); // Position X = 8
    
                }
                $fileContent = $pdf->Output('', 'S');
    
    
                if (!empty($flattenedFile) && is_file($flattenedFile)) {
                    unlink($flattenedFile);
                }
    
            } catch (\Exception $e) {
                $fileContent = null;
            }
    
            return $fileContent;
        }
    
    
        public static function checkDocumentSignatureField(array $args)
        {
    
            $libPath = CoreConfigModel::getSetaPdfFormFillerLibrary();
    
            if (!empty($libPath) && is_file($libPath)) {
                require_once($libPath);
    
    
                $targetFile = CoreConfigModel::getTmpPath() . "tmp_file_{$GLOBALS['id']}_" . rand() . "_target_watermark.pdf";
                file_put_contents($targetFile, base64_decode($args['encodedDocument']));
                $document = \SetaPDF_Core_Document::loadByFilename($targetFile);
    
                $formFiller = new \SetaPDF_FormFiller($document);
                $fields = $formFiller->getFields();
                $allFields = $fields->getAll();
    
                foreach ($allFields as $fieldValue) {
                    if ($fieldValue instanceof \SetaPDF_FormFiller_Field_Signature) {
                        $alreadySigned = true;
                        break;
                    }
                }
                // Release objects to free memory and cycled references.
                // After calling this method the instance of $document is unusable!
                $document->cleanUp();
                unlink($targetFile);
            }
    
            return $alreadySigned;
        }