您好,我创建了一个PHP函数,当您访问特定的URL时会通过电子邮件将PDF发送给您。
PDF是通过html2pdf,html2canvas和jspdf生成的。基本上,它使用访问的URL的页面内容来生成PDF。
页面内容是通过ajax动态生成的,而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正常工作”,表示页面已成功加载。我在生成pdf的js代码中添加了console.error()
条消息,生成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函数获取的页面内容。
在我的错误日志中,记录了所有“功能*”消息,但未记录任何“工人*”消息。老实说,我不知道原因,但我知道这是一个问题。当我运行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无法执行我需要做的事情,请随时建议我可以使用的任何其他库。