3

我正在使用 jsPDF 在客户端创建一个 pdf,并且使用pdf.save('document.pdf');. 现在我正在尝试通过使用 AJAX 和后端功能将电子邮件与 PDF 一起作为附件发送Zend_Mail,但它不起作用!

好吧,我试过了pdf.output();pdf.output('blob');也试过通过pdf.output('datauristring');但面临不同的问题。

首先,我已经通过 using 将 HTML 转换为 png domtoimage,其代码如下:

domtoimage.toPng(node)
    .then(function (dataUrl) {
        /* This function is used to generate or send output of the pdf to the back end */
        createCalendarPdf(dataUrl);
    })
    .catch(function (error) {
        alert('Oops, something went wrong! ' + error);
    }
);

为了在客户端下载 PDF,我简单地使用了它并且它可以工作

pdf.save('document.pdf');

发送blobbase64 string我遇到困难。

第一种方法

下面的代码将 PDF 输出更改为blob对象 url

BLOB 对象 URL

为 PDF 创建一个 blob 对象 url

var binaryImg = pdf.output();
var length = binaryImg.length;
var arrayBuffer = new ArrayBuffer(length);
var uintArray = new Uint8Array(arrayBuffer);

for (var i = 0; i < length; i++) {
    uintArray[i] = binaryImg.charCodeAt(i);
}

var currentBlob = new Blob([uintArray], {type: 'application/pdf'});

var createdBlobUrl = URL.createObjectURL(currentBlob);

# Output looks like this
blob:http://example.com/ff471a1c-702j-453d-01g0-d6a26l901bvz

AJAX 请求

使用FormData

var fd = new FormData();
fd.append('file', createdBlobUrl);

$.ajax({
    type: 'POST',
    url: functionUrl,
    data: fd,
    processData: false,
    contentType: false,
    async: false
}).done(function(data) {
    console.log(data);
});

所以,我不确定如何从blobZend 或简单的 PHP 中的对象 URL 获取内容。所以我尝试file_get_contents($this->_params['file'])了,但没有奏效!

第二种方法

由于字符串的长度,试图通过pdf.output();pdf.output('datauristring');无法在后端接收结果。正如我之前所说,我首先将 HTML 模板更改为 PNG,然后再创建一个 PDF。所以,这就是为什么 web 检查器卡在进程之间然后必须完全终止页面的原因。

已经增加了max_post_size和其他东西已经在php.ini

Zend_Mail 函数

$mail = new Zend_Mail();

$attachment = $mail->createAttachment($pdfFile);
$attachment->type = 'application/pdf';
$attachment->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
$attachment->encoding = Zend_Mime::ENCODING_BASE64;
$attachment->filename = 'document.pdf';

$mail->setBodyHtml($html);
$mail->setFrom($emailFrom, 'Adeel');
$mail->addTo($emailTo, 'ABC');
$mail->setHeaderEncoding(Zend_Mime::ENCODING_BASE64);
$mail->setSubject($subject);

// send email
$mail->send();

所以,简而言之,我只是想知道如何从blob对象 url 获取内容,如果有任何可能的方式或如何将base64字符串传递到后端并在 PHP 中解析它。

我已经花了几天的时间来寻找这个问题的解决方案,但是找不到,或者我在这里做错了什么。

4

1 回答 1

0

我使用了结合 canvas 和 jspdf 的 html2pdf 库,所以我确信工作仍然相同或大致相似。

第 1 步我创建 pdf 并将 datauristring 的输出设置为 blob

async function printer() {
  var worker = html2pdf();
  await worker.from(document.querySelector('#element'));
  let myPdf = await worker.outputPdf('datauristring', 'mypdf.pdf');
  
  //this converts the uri to blob
  var preBlob = dataURItoBlob(myPdf);
  var file = new File([preBlob], "namefile.pdf", {type: 'application/pdf'});
   
  // sends the message to api
  sendFile(file);
}

// 下面是将uri字符串转换为blob的函数

 function dataURItoBlob(dataURI) {
    // convert base64/URLEncoded data component to raw binary data held in a string
       var byteString;
       if (dataURI.split(',')[0].indexOf('base64') >= 0)
            byteString = atob(dataURI.split(',')[1]);
       else
          byteString = unescape(dataURI.split(',')[1]);
    
        // separate out the mime component
        var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
    
        // write the bytes of the string to a typed array
        var ia = new Uint8Array(byteString.length);
        for (var i = 0; i < byteString.length; i++) {
            ia[i] = byteString.charCodeAt(i);
        }
    
        return new Blob([ia], {type:mimeString});
    }

然后我就有了将电子邮件发送到 API 的实际功能。由于不熟悉 AJAX,我使用了 fetch:

 async function sendFile(userFiles) {
       let filePaths;
       let formData = new FormData();
       formData.append("file", userFiles);
       let response = await fetch('mailer.php', {
           method: 'POST',
           body: formData
       });
        
       filePaths = await response.json();
       return filePaths;
    }
于 2022-03-01T17:50:32.723 回答