Диаграммы Google не отображаются в Snappy PDF

Я пытаюсь загрузить диаграмму, а затем преобразовать ее в PDF, используя Laravel-snappy

Вот код, который я использую для создания pdf:

$pdf = SnappyPDF::loadView('report', []);
$pdf->setOption('enable-javascript', true);
$pdf->setOption('no-stop-slow-scripts', true);
$pdf->setOption('page-size', 'A4');
$pdf->setOption('lowquality', false);
$pdf->setOption('disable-smart-shrinking', true);
$pdf->setOption('images', true);
$pdf->setOption('window-status', 'ready');
$pdf->setOption('run-script', 'window.setTimeout(function(){window.status="ready";},5000);');
return $pdf->inline();

А вот HTML/CSS report.blade.php:

<head>
    <script src="http://www.gstatic.com/charts/loader.js"></script>
    <script>
      function init() {
        google.charts.load('current', {packages: ['corechart']});
        var interval = setInterval(function () {
          if (google.visualization !== undefined && google.visualization.DataTable !== undefined 
            && google.visualization.PieChart !== undefined) {
            clearInterval(interval);
            window.status = 'ready';
            drawChart();
          }
        }, 100);
      }

      function drawChart() {
        // Define the chart to be drawn.
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'Element');
        data.addColumn('number', 'Percentage');
        data.addRows([
          ['Nitrogen', 0.78],
          ['Oxygen', 0.21],
          ['Other', 0.01]
        ]);

        var chart = new google.visualization.PieChart(document.getElementById('myPieChart'));
        chart.draw(data, {});
      }
    </script>
</head>
<body onload="init()">
<div id="myPieChart" style="width: 500px; height: 500px;"></div>
</body>

Вывод PDF всегда возвращает пустую страницу.


person moh96    schedule 17.06.2020    source источник
comment
Я столкнулся с той же проблемой здесь. Через несколько недель (начало июня 2020 года?) Мои диаграммы больше не отображаются с помощью wkhtmltopdf с использованием laravel-snappy (Laravel 5.7). Раньше работало, а сейчас нет. Забавный факт, что когда я отображаю страницу в Интернете (не в формате PDF), диаграммы в порядке и хорошо отображаются. Но так как я использую этот пакет, он больше не работает. решения пока не нашел...   -  person Florian Doyen    schedule 21.06.2020


Ответы (2)


У меня была такая же проблема - получение пустой диаграммы или сообщения об ошибке «Неопределенное не является функцией».

После 3 дней перепробования всех возможных вариантов мне удалось вернуться к старой версии Google Charts.

<script>google.load("visualization", "44", {packages:["corechart"]});</script>

Раньше я использовал 1 для номера версии. И только что узнал, что использование версии 1 сейчас означает, что вы используете текущую версию! Из документа Google Charts: Все запросы 'jsapi' теперь перенаправляются в новый загрузчик. Если вы загружали версию «1» или «1.0», теперь вы загрузите «текущую».

Также пробовал версию 45, и она тоже не работает. Похоже, что в более новых версиях есть проблемы с загрузкой wkhtmlpdf.

person phpd    schedule 28.07.2020

Попробуйте это: благодаря https://github.com/barryvdh/laravel-snappy/issues/255#issuecomment-628815194

<script type="text/javascript" src="http://www.google.com/jsapi"></script>

    <script type="text/javascript">

        spandata = document.getElementsByClassName("spandata")
        spandatadate = document.getElementsByClassName("spandatadate")
        function init() {
          google.charts.load('current', {packages: ['corechart']});
          var interval = setInterval(function() {
            if ( google.visualization !== undefined && google.visualization.DataTable !== undefined && google.visualization.PieChart !== undefined ){ clearInterval(interval);
              window.status = 'ready';
              drawCharts();
            }
          }, 100);
        }



        function drawCharts() { // PROCESSING ... }
</script>

Где drawCharts() — это ваша функция, обрабатывающая рисование и т. д.

Наконец-то это сработало для меня, так что... Надеюсь, сработает и для вас!

Я до сих пор не могу понять, в чем проблема, но я думаю, это потому, что API диаграммы не может быть загружен быстро, поэтому wkhtmltopdf обрабатывает преобразование ДО загрузки диаграммы. Ожидание готовности DOM + установка интервала, кажется, решает проблему (на данный момент!)


ИЗМЕНИТЬ 21 июня 2020 г.

Забыл сказать : http://www.google.com/jsapi перенаправить на страницу HTTPS для gstatic. (https://www.gstatic.com/charts/loader.js), которые это новое место для JS API Google. Итак, если вы хотите, чтобы wkhtmltopdf работал, вам необходимо установить пакет libssl.

sudo apt-get install libssl1.0-dev

Вы можете попробовать, если он работает с

wkhtmltopdf https://google.com google.pdf

Если нет, у вас будет такой вывод:

Loading pages (1/6)
QSslSocket: cannot resolve CRYPTO_num_locks                  ] 10%
QSslSocket: cannot resolve CRYPTO_set_id_callback
QSslSocket: cannot resolve CRYPTO_set_locking_callback
QSslSocket: cannot resolve sk_free
QSslSocket: cannot resolve sk_num
QSslSocket: cannot resolve sk_pop_free
QSslSocket: cannot resolve sk_value
QSslSocket: cannot resolve SSL_library_init
QSslSocket: cannot resolve SSL_load_error_strings
QSslSocket: cannot resolve SSLv3_client_method
QSslSocket: cannot resolve SSLv23_client_method
QSslSocket: cannot resolve SSLv3_server_method
QSslSocket: cannot resolve SSLv23_server_method
QSslSocket: cannot resolve X509_STORE_CTX_get_chain
QSslSocket: cannot resolve OPENSSL_add_all_algorithms_noconf
QSslSocket: cannot resolve OPENSSL_add_all_algorithms_conf
QSslSocket: cannot resolve SSLeay
QSslSocket: cannot call unresolved function CRYPTO_num_locks
QSslSocket: cannot call unresolved function CRYPTO_set_id_callback
QSslSocket: cannot call unresolved function CRYPTO_set_locking_callback
QSslSocket: cannot call unresolved function SSL_library_init
QSslSocket: cannot call unresolved function SSLv23_client_method
QSslSocket: cannot call unresolved function sk_num
QSslSocket: cannot call unresolved function SSLv23_client_method
QSslSocket: cannot call unresolved function SSL_library_init
Error: Failed loading page https://google.com (sometimes it will work just to ignore this error with --load-error-handling ignore)
Exit with code 1 due to network error: UnknownNetworkError
QSslSocket: cannot call unresolved function CRYPTO_num_locks
QSslSocket: cannot call unresolved function CRYPTO_set_id_callback
QSslSocket: cannot call unresolved function CRYPTO_set_locking_callback

После установки libssl вывод для теста google.pdf должен быть

Loading pages (1/6)
Counting pages (2/6)                                               
Resolving links (4/6)                                                       
Loading headers and footers (5/6)                                           
Printing pages (6/6)
Done 

Я использую:

Laravel 5.7
PHP 7.1.3
barryvdh/laravel-dompdf ^0.8.5
barryvdh/laravel-snappy ^0.4.6
wkhtmltopdf 0.12.4 (with patched qt)
Ubuntu 18.04 LTS
person Florian Doyen    schedule 21.06.2020
comment
Какую версию wkhtmltopdf вы используете? - person moh96; 21.06.2020
comment
Я решил свою проблему, установив wkhtmltopdf 0.12.6 (с исправленным qt). Как вы сказали в своем ответе, проблема связана с использованием https.., который исправлен в этой версии. Благодарю вас! - person moh96; 21.06.2020
comment
@ moh96 рад видеть, что это решило вашу проблему, не стесняйтесь автоматически ответить на ваш вопрос, какое решение и подтвердить его, это может помочь другим. Или вы также можете подтвердить мою, если она вам помогла! Хорошего дня ! - person Florian Doyen; 21.06.2020