Автоматизация страницы PHP, которая загружает страницу JS (PhantomJS) - PullRequest
0 голосов
/ 21 июня 2019

Привет! Я создал функцию 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 не может делать то, что мне нужно, не стесняйтесь предлагать другие библиотеки, которые я мог бы использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...