Как отправить 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;
}