Как отправить PDF (jsPdf) на сервер (PHP - Zend 1)

Я использую jsPDF для создания PDF на стороне клиента, и он отлично работает с помощью pdf.save('document.pdf');, Теперь я пытаюсь отправить электронное письмо вместе с PDF в качестве вложения, используя AJAX и Zend_Mail функция на заднем конце, но это не работает!

Ну я пробовал pdf.output();, pdf.output('blob'); а также пытался пройти pdf.output('datauristring'); но сталкиваются с разными проблемами.

Прежде всего, я преобразовал 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');

Для отправки blob или же base64 string У меня трудности.

Первый подход

Код ниже, чтобы изменить вывод PDF в blob URL объекта

URL объекта BLOB

Создание URL объекта BLOB для PDF

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);
});

Итак, я не уверен, как получить контент от blob URL объекта в Zend или простом PHP. Так я попробовал file_get_contents($this->_params['file']) но это не сработало!

Второй подход

Пытался пройти pdf.output(); или же pdf.output('datauristring'); но не смог получить результат на стороне сервера из-за длины строки. Как я уже говорил ранее, я сначала изменил шаблон HTML на PNG, а затем создал из него PDF. Вот почему веб-инспектор застрял между процессами и затем должен полностью убить страницу.

Уже увеличила 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.

Я уже потратил несколько дней на то, чтобы найти решение этой проблемы, но не смог его найти, или, возможно, я что-то здесь не так сделал.

1 ответ

Я использовал библиотеку html2pdf, которая сочетает в себе холст и jspdf, поэтому я уверен, что работа будет такой же или примерно такой же.

Шаг 1. Я создаю PDF-файл и устанавливаю вывод datauristring в виде большого двоичного объекта.

      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:

       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;
    }
Другие вопросы по тегам