Привет! Я создал функцию PHP, которая отправляет вам по электронной почте PDF при посещении определенного URL.
PDF создается с помощью html2pdf, html2canvas и jspdf. Он в основном использует содержимое страницы посещенного URL для создания PDF.
Содержимое страницы генерируется динамически через ajax, который загружает различное содержимое страницы в зависимости от запроса URL.
Теперь мне нужно запланировать эту функцию отправки электронной почты в формате PDF, которую я планирую сделать с помощью чего-то вроде PhantomJS. Я не могу использовать curl для вызова URL, потому что это не создаст динамическое содержимое страницы, которое нужно сгенерировать в PDF.
Я пытался сделать это, используя библиотеку PHP PhantomJS (https://github.com/jonnnnyw/php-phantomjs) Я добавил свой код ниже:
$client = Client::getInstance();
$client->getEngine()->debug(true);
$client->isLazy();
$request = $client->getMessageFactory()->createRequest('url', 'GET');
$request->addHeader('Content-Type', 'application/json');
$request->addHeader('Authorization', $authorization);
$request->setTimeout(100000);
$response = $client->getMessageFactory()->createResponse();
// Send the request
$client->send($request, $response);
if($response->getStatus() === 200) {
// Dump the requested page content
error_log("phantomjs worked");
error_log(print_r($response->getConsole(), true));
}
else {
error_log("phantomjs didn't work: " . $response->getStatus());
}
Этот журнал "phantomjs работал" означает, что страница успешно загружена. Я добавил несколько console.error()
сообщений в мой js-код, который генерирует PDF. Код для генерации PDF показан ниже.
function genSummaryPDF(pages) {
console.error("function 1");
var opt = {
margin: [70, 26],
filename: 'pdf_summary.pdf',
image: { type: 'jpeg', quality: 1 },
html2canvas: { scale: 1 },
jsPDF: { unit: 'mm', format: ['420', '594'], orientation: 'p' }
};
// https://github.com/eKoopmans/html2pdf.js/issues/19
var worker = html2pdf().set(opt).from(pages[0]).toPdf();
pages.slice(1).forEach(function (page) {
worker = worker.get('pdf').then(function (pdf) {
pdf.addPage();
}).from(page).toContainer().toCanvas().toPdf().get('pdf');
});
console.error("function 2");
worker = worker.then(function (pdfObject) {
totalPages = pdfObject.internal.getNumberOfPages();
console.error("worker 1");
for (var i = 1; i <= totalPages; i++) {
pdfObject.setPage(i)
pages.push(pdfObject.setPage(i));
}
});
console.error("function 3");
/**
* Convert the PDF to a Data URI string which can be stored on the server and sent in an email
*/
worker.toPdf().output('datauristring').then(function (pdfAsString) {
console.error("worker 2");
// Get CSRF token
// var csrf_token = $("meta[name=csrf_token]").attr("content");
$.ajax({
url: '{{site.uri.public}}/pdf-report-scheduler/' + pdf_schedule_id,
type: "POST",
// data: { pdf_file: pdfAsString, csrf_token: csrf_token }
data: { pdf_file: pdfAsString }
});
});
}
Переменная pages[0]
содержит содержимое страницы, полученной из функции ajax.
В моих журналах ошибок все сообщения «function *» были зарегистрированы, но ни одно из сообщений «worker *» не было зарегистрировано. Честно говоря, я не знаю причину этого, но я знаю, что это проблема. Когда я запускаю код PhantomJs, я не получаю никаких ошибок, но pdf не генерируется, и я знаю, что функция {{site.uri.public}}/pdf-report-scheduler/
не вызывается, то есть этот код js не запускается, так как ошибка «worker 2» не зарегистрирован, и error_log
, который я добавил к функции, стоящей за {{site.uri.public}}/pdf-report-scheduler/
, также не регистрируется.
Нужно ли вводить JS в мой скрипт PhantomJs или что-то в этом роде? Причина, по которой я добавил $request->setTimeout(100000);
, была в надежде, что страница загрузится полностью, но я не думаю, что это так.
Если PhantomJS не может делать то, что мне нужно, не стесняйтесь предлагать другие библиотеки, которые я мог бы использовать.