jsPDF, html2canvas, PHPMailer, 再次......!将 PDF 附加到邮件

Posted

技术标签:

【中文标题】jsPDF, html2canvas, PHPMailer, 再次......!将 PDF 附加到邮件【英文标题】:jsPDF, html2canvas, PHPMailer, again...! Attach PDF to mail 【发布时间】:2017-02-22 05:11:41 【问题描述】:

我已经阅读了很多关于“如何通过 phpMailer 从 html2canva 或 jsPDF 附加 PDF”的答案,但我尝试的一切都不起作用。

现在,我有一个带有一些输入的 HTML 页面。当客户填写完所有这些后,他点击发送按钮。

html2canva 截图 jsPDF 根据需要将其剪切成页面 jQuery 将 PDF 发送到 PHP 脚本 PHPMailer 接收并通过邮件发送。

一切正常,除了 PDF 文件的附件。

所以,我需要你的帮助;)

这就是我所拥有的:

JS 脚本:

    html2canvas($("#Div"), 
    onrendered: function(canvas) 

        //=== Take screenshot  
        var imgData = canvas.toDataURL('image/jpeg');   

        //=== PDFize it
        var doc = new jsPDF("p", "px");
        var options = 
             pagesplit: true
        ;

        //=== Split it
        var imgWidth = 210; 
        var pageHeight = 295;  
        var imgHeight = canvas.height * imgWidth / canvas.width;
        var heightLeft = imgHeight;

        var doc = new jsPDF('p', 'mm');
        var position = 0;

        doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
        heightLeft -= pageHeight;

        while (heightLeft >= 0) 
          position = heightLeft - imgHeight;
          doc.addPage();
          doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
          heightLeft -= pageHeight;
        

        //=== Send it       
        $.post("mail.php", 
        
            data: doc;
        , function () ).done(function() /*SOME CODE*/);    

        //=== Just to test the PDF      
        doc.save( 'file.pdf');
    
);

还有我的 PHP 脚本:

<?php

if(!empty($_POST['data']))


    require 'lib/PHPMailer-master/PHPMailerAutoload.php';
    $mail = new PHPMailer;

    $mail->isSMTP();
    $mail->Host = '*';
    $mail->SMTPAuth = *; 
    $mail->Username = '*';
    $mail->Password = '*';          
    $mail->SMTPSecure = '*';                           
    $mail->Port = *;                                   

    $mail->setFrom('*', '*');
    $mail->addAddress('*', '*');   

    //=== Tested this
    $originalbase = $base;
    //=== or this
    $base = explode('data:application/pdf;base64,', $_POST['data']);
    $mail->addStringAttachment($originalbase, "name.pdf", "base64", "application/pdf");

    $mail->isHTML(true);                              

    $mail->Subject = '*';
    $mail->Body    = '*';

    if(!$mail->send()) 
        echo 'Message could not be sent.';
        echo 'Mailer Error: ' . $mail->ErrorInfo;
     else 
        echo 'Message has been sent';
    

 else echo "No Data Found"; 

?>

我测试过 base64 解码,没有,使用 mime 类型,没有...

编辑 1:13.10.2016 好像还不错

var PDF = doc.output('datauri');

$base = explode('data:application/pdf;base64,', $_POST['data']);
$base = base64_decode($base[1]);
$mail->addStringAttachment($base, 'pdfName.pdf');

编辑 2:13.10.2016 替换

var PDF = doc.output('datauri');

通过

var PDF = doc.output('datauristring');

为了避免重定向到创建的 PDF

【问题讨论】:

【参考方案1】:

使用html2pdf,当用户提交表单时,将整个HTML代码发送到php然后使用这部分代码来创建你的pdf

 $htmlCode= $_POST["htmlCodeSentWithJquery"];

 require_once(dirname(__FILE__).'/html2pdf/html2pdf.class.php');
 $html2pdf = new HTML2PDF('P','A4','fr');
 $html2pdf->WriteHTML($htmlCode);
 $html2pdf->Output('pdfFileName.pdf');

更多关于构造函数的信息

/**
 * Constructeur
 *
 * @param   string      $sens - landscape or portrait orientation
 * @param   string      $format - format A4, A5, ...
 * @param   string      $langue - language: fr, en, it ... 
 * @param   boolean     $unicode - TRUE means clustering the input text IS unicode (default = true)
 * @param   String      $encoding - charset encoding; Default is UTF-8
 * @param   array       $marges - margins by default, in order (left, top, right, bottom)
 * @return  null
 */
public function __construct($sens = 'P', $format = 'A4', $langue='en', $unicode=true, $encoding='UTF-8', $marges = array(5, 5, 5, 8))

然后使用您的电子邮件功能发送文件

使用html2pdf邮件功能

   $content_PDF = $html2pdf->Output('', true);  
   require_once(dirname(__FILE__).'/pjmail/pjmail.class.php'); 
   $mail = new PJmail(); 
   $mail->setAllFrom('webmaster@my_site.net', "My personal site"); 
   $mail->addrecipient('mail_user@my_site.net'); 
   $mail->addsubject("Example sending PDF"); 
   $mail->text = "This is an example of sending a PDF file"; 
   $mail->addbinattachement("my_document.pdf", $content_PDF); 
   $res = $mail->sendmail(); 

More about the email function

【讨论】:

感谢您的帮助,但是由于整个系统使用html2canva库,我无法打开html2pdf... 检查我的其他答案,如果他们觉得有用,我会为其他人提供这个答案【参考方案2】:

试试这行不加其他参数,如果不行,能否分享下base64的一部分贴到php中

$mail->addStringAttachment($pdfString, 'pdfName.pdf');

【讨论】:

我不得不对从 JS 接收到的 PHP var 进行一点扩展。 $base = explode('data:application/pdf;base64,', $_POST['data']); $base = base64_decode($base[1]); $mail->addStringAttachment($base, 'pdfName.pdf'); PDF 被直接传递给 PHPMailer,同时也被传递到 JS "var PDF = doc.output('datauri');" 现在,我需要知道为什么我的网页 - 发送邮件后 - 被重定向到 PDF :O 去掉 //=== 只是为了测试 PDF doc.save('file.pdf'); 好的,找到了!替换 var PDF = doc.output('datauri'); by var PDF = doc.output('datauristring');【参考方案3】:
//=== Send it       
$.post("mail.php", 

  data: doc;
, function () ).done(function() /*SOME CODE*/);   

BY 

//=== Send it       
$.post("mail.php", 

  data: doc //or doc.output('datauristring')
, function () ).done(function() /*SOME CODE*/);   

【讨论】:

你的意思是用后者替换前者吗?

以上是关于jsPDF, html2canvas, PHPMailer, 再次......!将 PDF 附加到邮件的主要内容,如果未能解决你的问题,请参考以下文章

javascript Html2canvas和jsPDF

vue pdf导出 html2canvas+jspdf

html2canvas + jspdf 实现 html 转 pdf

前端HTML页面转PDF(html2canvas+jspdf)

前端生成pdf,jspdf+html2Canvas的使用(vue)

html2canvas&&jspdf--pdf本地下载的屏幕自定义缩放问题,只下载一页,水印,命名文件