Search code examples
phpajaxjspdfhtml2canvas

html2canvas and jsPDF : send generated pdf as email attachment


I have created a function to take screenshot of current webpage and save it as PDF using html2canvas and jsPDF. Following is my code for it:

<script>
 function downloadpdf(){
    html2canvas(document.body,
        {
            onrendered: function(canvas){
                var imgData = canvas.toDataURL("image/jpeg");
                var a = document.createElement('a');
                var doc = new jsPDF('p','mm');
                doc.addImage(imgData, 'JPEG', 15, 40, 180, 160);
                doc.save($.now()+'.pdf');

        }
    });
}
</script>

By using the above code, I am able to download the file and save it locally. But I want to directly send the generated pdf by email using php script.

Following is the code for posting image in php script where it will be sent as email:

var imgData = canvas.toDataURL("image/jpeg");
                $.post("sendimage.php", 
                {
                    data: imgData
                }, function (response,status) {
                    console.log(response);
                });

But how to post the generated pdf in data parameter?

Kindly, recommend any solution for this.


Solution

  • Please check the PHP code -

    function MailWithAttachment($to, $subject, $message, $senderMail, $senderName, $files){
    
        $from = $senderName." <".$senderMail.">"; 
        $headers = "From: $from";
    
        // boundary 
        $semi_rand = md5(time()); 
        $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 
    
        // headers for attachment 
        $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; 
    
        // multipart boundary 
        $message = "--{$mime_boundary}\n" . "Content-Type: text/html; charset=\"UTF-8\"\n" .
        "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n"; 
    
        // preparing attachments
        if(count($files) > 0){
            for($i=0;$i<count($files);$i++){
                if(is_file($files[$i])){
                    $message .= "--{$mime_boundary}\n";
                    $fp =    @fopen($files[$i],"rb");
                    $data =  @fread($fp,filesize($files[$i]));
                    @fclose($fp);
                    $data = chunk_split(base64_encode($data));
                    $message .= "Content-Type: application/octet-stream; name=\"".basename($files[$i])."\"\n" . 
                    "Content-Description: ".basename($files[$i])."\n" .
                    "Content-Disposition: attachment;\n" . " filename=\"".basename($files[$i])."\"; size=".filesize($files[$i]).";\n" . 
                    "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
                }
            }
        }
        $message .= "--{$mime_boundary}--";
        $returnpath = "-f" . $senderMail;
    
        //send email
        $mail = @mail($to, $subject, $message, $headers, $returnpath); 
    
        //function return true, if email sent, otherwise return fasle
        if($mail){ return TRUE; } else { return FALSE; }
    }
    
    
    if(!empty($_POST['data'])){
    
        //email variables
        $to = 'to-email@email.com';
        $from = 'from-email@email.com';
        $from_name = 'PDF FIle';
    
        //attachment files path array
        $file = base64_decode($_POST['data']);
    
        $subject = 'PHP Email with attachment'; 
        $html_content = '<h1>PHP Email with attachment</h1>';
    
        //call MailWithAttachment() function and pass the required arguments
        $send_email = MailWithAttachment($to,$subject,$html_content,$from,$from_name,$file);
    
        //print message after email sent
        echo $send_email?"<h1> Mail Sent</h1>":"<h1> Mail not SEND</h1>";
    
    } else {
        echo "No Data Found";
    } 
    

    I hope it will work for you :)