249 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			249 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
if (!defined('ABSPATH')) {
 | 
						|
    exit;
 | 
						|
}
 | 
						|
 | 
						|
class WPDD_Watermark {
 | 
						|
    
 | 
						|
    public static function apply_watermark($file_path, $order) {
 | 
						|
        $file_extension = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
 | 
						|
        
 | 
						|
        if (filter_var($file_path, FILTER_VALIDATE_URL)) {
 | 
						|
            $upload_dir = wp_upload_dir();
 | 
						|
            if (strpos($file_path, $upload_dir['baseurl']) === 0) {
 | 
						|
                $file_path = str_replace($upload_dir['baseurl'], $upload_dir['basedir'], $file_path);
 | 
						|
            } else {
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        
 | 
						|
        if (!file_exists($file_path)) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
        
 | 
						|
        $product_id = $order->product_id;
 | 
						|
        $watermark_text = get_post_meta($product_id, '_wpdd_watermark_text', true);
 | 
						|
        
 | 
						|
        if (empty($watermark_text)) {
 | 
						|
            $watermark_text = '{customer_email}';
 | 
						|
        }
 | 
						|
        
 | 
						|
        $watermark_text = self::parse_watermark_placeholders($watermark_text, $order);
 | 
						|
        
 | 
						|
        switch ($file_extension) {
 | 
						|
            case 'jpg':
 | 
						|
            case 'jpeg':
 | 
						|
            case 'png':
 | 
						|
            case 'gif':
 | 
						|
                return self::watermark_image($file_path, $watermark_text);
 | 
						|
            case 'pdf':
 | 
						|
                return self::watermark_pdf($file_path, $watermark_text);
 | 
						|
            default:
 | 
						|
                return false;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    
 | 
						|
    private static function parse_watermark_placeholders($text, $order) {
 | 
						|
        $customer = get_userdata($order->customer_id);
 | 
						|
        
 | 
						|
        $replacements = array(
 | 
						|
            '{customer_name}' => $order->customer_name,
 | 
						|
            '{customer_email}' => $order->customer_email,
 | 
						|
            '{order_id}' => $order->order_number,
 | 
						|
            '{date}' => date_i18n(get_option('date_format')),
 | 
						|
            '{site_name}' => get_bloginfo('name')
 | 
						|
        );
 | 
						|
        
 | 
						|
        return str_replace(array_keys($replacements), array_values($replacements), $text);
 | 
						|
    }
 | 
						|
    
 | 
						|
    private static function watermark_image($file_path, $watermark_text) {
 | 
						|
        if (!function_exists('imagecreatefrompng')) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
        
 | 
						|
        $file_info = pathinfo($file_path);
 | 
						|
        $extension = strtolower($file_info['extension']);
 | 
						|
        
 | 
						|
        switch ($extension) {
 | 
						|
            case 'jpg':
 | 
						|
            case 'jpeg':
 | 
						|
                $image = imagecreatefromjpeg($file_path);
 | 
						|
                break;
 | 
						|
            case 'png':
 | 
						|
                $image = imagecreatefrompng($file_path);
 | 
						|
                break;
 | 
						|
            case 'gif':
 | 
						|
                $image = imagecreatefromgif($file_path);
 | 
						|
                break;
 | 
						|
            default:
 | 
						|
                return false;
 | 
						|
        }
 | 
						|
        
 | 
						|
        if (!$image) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
        
 | 
						|
        $width = imagesx($image);
 | 
						|
        $height = imagesy($image);
 | 
						|
        
 | 
						|
        $font_size = max(10, min(30, $width / 40));
 | 
						|
        $font_file = WPDD_PLUGIN_PATH . 'assets/fonts/arial.ttf';
 | 
						|
        
 | 
						|
        if (!file_exists($font_file)) {
 | 
						|
            $font = 5;
 | 
						|
            $text_width = imagefontwidth($font) * strlen($watermark_text);
 | 
						|
            $text_height = imagefontheight($font);
 | 
						|
        } else {
 | 
						|
            $bbox = imagettfbbox($font_size, 0, $font_file, $watermark_text);
 | 
						|
            $text_width = $bbox[2] - $bbox[0];
 | 
						|
            $text_height = $bbox[1] - $bbox[7];
 | 
						|
        }
 | 
						|
        
 | 
						|
        $x = ($width - $text_width) / 2;
 | 
						|
        $y = $height - 50;
 | 
						|
        
 | 
						|
        $text_color = imagecolorallocatealpha($image, 255, 255, 255, 30);
 | 
						|
        $shadow_color = imagecolorallocatealpha($image, 0, 0, 0, 50);
 | 
						|
        
 | 
						|
        if (file_exists($font_file)) {
 | 
						|
            imagettftext($image, $font_size, 0, $x + 2, $y + 2, $shadow_color, $font_file, $watermark_text);
 | 
						|
            imagettftext($image, $font_size, 0, $x, $y, $text_color, $font_file, $watermark_text);
 | 
						|
        } else {
 | 
						|
            imagestring($image, $font, $x + 2, $y + 2, $watermark_text, $shadow_color);
 | 
						|
            imagestring($image, $font, $x, $y, $watermark_text, $text_color);
 | 
						|
        }
 | 
						|
        
 | 
						|
        $temp_dir = get_temp_dir();
 | 
						|
        $temp_file = $temp_dir . 'wpdd_watermark_' . uniqid() . '.' . $extension;
 | 
						|
        
 | 
						|
        switch ($extension) {
 | 
						|
            case 'jpg':
 | 
						|
            case 'jpeg':
 | 
						|
                imagejpeg($image, $temp_file, 90);
 | 
						|
                break;
 | 
						|
            case 'png':
 | 
						|
                imagepng($image, $temp_file, 9);
 | 
						|
                break;
 | 
						|
            case 'gif':
 | 
						|
                imagegif($image, $temp_file);
 | 
						|
                break;
 | 
						|
        }
 | 
						|
        
 | 
						|
        imagedestroy($image);
 | 
						|
        
 | 
						|
        return $temp_file;
 | 
						|
    }
 | 
						|
    
 | 
						|
    private static function watermark_pdf($file_path, $watermark_text) {
 | 
						|
        if (!class_exists('TCPDF') && !class_exists('FPDF')) {
 | 
						|
            return self::watermark_pdf_basic($file_path, $watermark_text);
 | 
						|
        }
 | 
						|
        
 | 
						|
        if (class_exists('TCPDF')) {
 | 
						|
            return self::watermark_pdf_tcpdf($file_path, $watermark_text);
 | 
						|
        }
 | 
						|
        
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
    
 | 
						|
    private static function watermark_pdf_basic($file_path, $watermark_text) {
 | 
						|
        $temp_dir = get_temp_dir();
 | 
						|
        $temp_file = $temp_dir . 'wpdd_watermark_' . uniqid() . '.pdf';
 | 
						|
        
 | 
						|
        if (copy($file_path, $temp_file)) {
 | 
						|
            return $temp_file;
 | 
						|
        }
 | 
						|
        
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
    
 | 
						|
    private static function watermark_pdf_tcpdf($file_path, $watermark_text) {
 | 
						|
        require_once ABSPATH . 'wp-admin/includes/class-pclzip.php';
 | 
						|
        
 | 
						|
        $pdf = new TCPDF();
 | 
						|
        $pdf->SetProtection(array('print'), '', null, 0, null);
 | 
						|
        
 | 
						|
        $pagecount = $pdf->setSourceFile($file_path);
 | 
						|
        
 | 
						|
        for ($i = 1; $i <= $pagecount; $i++) {
 | 
						|
            $tplidx = $pdf->importPage($i);
 | 
						|
            $pdf->AddPage();
 | 
						|
            $pdf->useTemplate($tplidx);
 | 
						|
            
 | 
						|
            $pdf->SetFont('helvetica', '', 12);
 | 
						|
            $pdf->SetTextColor(200, 200, 200);
 | 
						|
            $pdf->SetAlpha(0.5);
 | 
						|
            
 | 
						|
            $pdf->StartTransform();
 | 
						|
            $pdf->Rotate(45, $pdf->getPageWidth() / 2, $pdf->getPageHeight() / 2);
 | 
						|
            $pdf->Text(
 | 
						|
                $pdf->getPageWidth() / 2 - 50,
 | 
						|
                $pdf->getPageHeight() / 2,
 | 
						|
                $watermark_text
 | 
						|
            );
 | 
						|
            $pdf->StopTransform();
 | 
						|
            
 | 
						|
            $pdf->SetAlpha(1);
 | 
						|
        }
 | 
						|
        
 | 
						|
        $temp_dir = get_temp_dir();
 | 
						|
        $temp_file = $temp_dir . 'wpdd_watermark_' . uniqid() . '.pdf';
 | 
						|
        
 | 
						|
        $pdf->Output($temp_file, 'F');
 | 
						|
        
 | 
						|
        return $temp_file;
 | 
						|
    }
 | 
						|
    
 | 
						|
    public static function add_text_watermark($content, $watermark_text) {
 | 
						|
        $watermark_html = sprintf(
 | 
						|
            '<div style="position: fixed; top: 50%%; left: 50%%; transform: translate(-50%%, -50%%) rotate(-45deg); 
 | 
						|
                        opacity: 0.1; font-size: 48px; color: #000; z-index: -1; user-select: none;">%s</div>',
 | 
						|
            esc_html($watermark_text)
 | 
						|
        );
 | 
						|
        
 | 
						|
        return $watermark_html . $content;
 | 
						|
    }
 | 
						|
    
 | 
						|
    public static function get_watermark_settings() {
 | 
						|
        return array(
 | 
						|
            'enabled' => get_option('wpdd_watermark_enabled', false),
 | 
						|
            'text' => get_option('wpdd_watermark_text', '{customer_email}'),
 | 
						|
            'position' => get_option('wpdd_watermark_position', 'center'),
 | 
						|
            'opacity' => get_option('wpdd_watermark_opacity', 30),
 | 
						|
            'font_size' => get_option('wpdd_watermark_font_size', 'auto'),
 | 
						|
            'color' => get_option('wpdd_watermark_color', '#ffffff')
 | 
						|
        );
 | 
						|
    }
 | 
						|
    
 | 
						|
    public static function preview_watermark($file_type = 'image') {
 | 
						|
        $settings = self::get_watermark_settings();
 | 
						|
        $preview_text = str_replace(
 | 
						|
            array('{customer_name}', '{customer_email}', '{order_id}', '{date}', '{site_name}'),
 | 
						|
            array('John Doe', 'john@example.com', 'WPDD-123456', date_i18n(get_option('date_format')), get_bloginfo('name')),
 | 
						|
            $settings['text']
 | 
						|
        );
 | 
						|
        
 | 
						|
        if ($file_type === 'image') {
 | 
						|
            $width = 600;
 | 
						|
            $height = 400;
 | 
						|
            
 | 
						|
            $image = imagecreatetruecolor($width, $height);
 | 
						|
            $bg_color = imagecolorallocate($image, 240, 240, 240);
 | 
						|
            imagefill($image, 0, 0, $bg_color);
 | 
						|
            
 | 
						|
            $text_color = imagecolorallocatealpha($image, 100, 100, 100, 50);
 | 
						|
            
 | 
						|
            $font_size = 20;
 | 
						|
            $x = ($width - (strlen($preview_text) * 10)) / 2;
 | 
						|
            $y = $height / 2;
 | 
						|
            
 | 
						|
            imagestring($image, 5, $x, $y, $preview_text, $text_color);
 | 
						|
            
 | 
						|
            header('Content-Type: image/png');
 | 
						|
            imagepng($image);
 | 
						|
            imagedestroy($image);
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |