加载JS页面的PHP页面自动化(PhantomJS)

时间:2019-06-21 11:03:03

标签: phantomjs

您好,我创建了一个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无法执行我需要做的事情,请随时建议我可以使用的任何其他库。

0 个答案:

没有答案