【问题标题】:DOMPDF - Display google chart in the PDF where data obtained from databaseDOMPDF - 在从数据库中获取数据的 PDF 中显示谷歌图表
【发布时间】:2017-01-12 11:26:27
【问题描述】:

我正在使用 Google Charts API 和我的数据库中的数据生成图表,这意味着调用了外部文件并且数据以 JSON 格式回显。我知道图表可以转换为图像,所以我认为这可能有效,但不幸的是我没有尝试过以下代码:

  google.load("visualization", "1", {packages:["corechart"]});
  google.setOnLoadCallback(drawChart);

  function drawChart() {
    var jsonData = $.ajax({
  url: "getData.php?id=<?php echo $user_id; ?>';",
  dataType:"json",
  async: false
  }).responseText;
    var data = new google.visualization.DataTable(jsonData);

   var options = {
        hAxis: {
          title: 'Audit Number'
        },
        vAxis: {
          title: 'Gross Profit %'
        }
      };
    var chart_div = document.getElementById('chart_div');
    var chart = new google.visualization.LineChart(document.getElementById('chart_div'));

   google.visualization.events.addListener(chart, 'ready', function () {
    var imgUri = chart.getImageURI();
    // do something with the image URI, like:
    document.getElementById('chartImg').src = imgUri;
});

        chart.draw(data, options);

  }

然后我调用在 PDF 报告中包含图表

   $rep_table = " <html><img id='chartImg' />

当我在 HTML 视图中加载页面时,它会显示图表,但它仍然是交互式的,所以第一个问题肯定与图表的转换有关。

生成报告的代码如下所示

$total = db::c()->query("
        SELECT sum(value) FROM stocktake_allowances WHERE stocktake_id = '{$stocktake_id}' AND customer_id = '".$user_id."';")->fetchColumn(0);        

    $dep_qry = "SELECT
                     category_name AS category_name,allowance_date AS date, SUM(value) AS total_cost
                FROM stocktake_allowances
                ";


    $dep_qry .= " WHERE stocktake_id = '{$stocktake_id}' AND customer_id = '".$user_id."'
                  ";

    $dep_qry .= "
            GROUP BY TRIM(UPPER(category_name))
            ORDER BY category_name, allowance_date ASC";

    //echo $dep_qry;

    $dep_res = db::c()->query($dep_qry);
    $rep_table .= " <html><img id='chartImg' /><img id='chart_div' /><br/><br/><link rel='stylesheet' href='./index/style.css' type='text/css'>  <table class='st_det_rep' >
                             <tr>
                                 <td style='width:80%; text-align:center; font-size:30px;'>
                                  <img src='index/EasyCountio.png' alt='EasyCount.io' height='61' width='280'/><br/><br/><br/><br/>
                                     <strong>Wastage Summary</strong><br/>

                                 </td>

                            </tr>
                         </table>";          
    $rep_table .= "
                 <table id='stock_detail_report' cellspacing='0' style='margin-top:10px;'>
                     <tr>
                         <td class='top' style='width:30%;'><div class='nosplit'>Wastage Category</div></td>
                         <td class='top' style='width:15%;'><div class='nosplit'>Ref. No.</div></td>
                         <td class='top' style='width:15%;'><div class='nosplit'>Value</div></td>

                     </tr>";
    $sum_total_cost = 0;
    $sum_total_retail = 0;
    $sum_total_qty = 0;
    $counter = 1;
    $j=0;

     while ($row = $dep_res->fetch(PDO::FETCH_ASSOC))
    {        
        $total_cost = $row['total_cost'];//$row['unit_cost_price']*$row['qty'];
        $catName = $row['category_name'];
        $sum_total_cost += $total_cost;

        $date = date("d-M-y", strtotime($row['date']));
        $tc = number_format($total_cost, 2);

        if(!($j%2)) {
        $cssClass = 'odd';
         } else {
            $cssClass = 'even';
         }
         $j++;


        $rep_table .= "<tr>
                       <td style='text-align:right;'><div class='nosplit'>".$catName."</div></td>
                       <td style='text-align:right;'><div class='nosplit'>".$counter."</div></td>
                       <td style='text-align:right;'><div class='nosplit'>&#8364;".$total_cost."</div></td>


                    </tr>";                
        $counter++;
    }

    $stc = number_format($sum_total_cost, 2);

    $rep_table .= "<tr>
                    <td class='bottom' colspan = '2'><div class='nosplit'>Total Wastage:</div></td>

                    <td class='bottom'><div class='nosplit'>&#8364;".$stc."</div></td>
                </tr>
            </table>";

     $dompdf = new Dompdf();
     $dompdf->loadHtml($rep_table);

    // // (Optional) Setup the paper size and orientation
     $dompdf->setPaper('A4', 'l');

    // // Render the HTML as PDF
     $dompdf->render();

    // // Output the generated PDF to Browser
     $dompdf->stream("Allowances Summary.pdf", array("Attachment" => false));

更大的问题是在报告中包含图表。当我尝试生成 PDF 报告时,我收到一条错误消息,指出标头已发送。我使用了关于 SO 的提示之一来找出问题所在,这就是我得到的结果:

/home/arturl/public_html/platform/class/class_report.php
21

对应的

 url: "getData.php?id=<?php echo $user_id; ?>';",

这很有意义,因为 json 字符串被回显并且 DOMPDF 将其视为标题。有没有其他方法可以做到这一点?

【问题讨论】:

    标签: php json pdf charts dompdf


    【解决方案1】:

    当你说...

    当我在 HTML 视图中加载页面时,它会显示图表,但它仍然是交互式的

    听起来你想用它的图像替换图表

    看下面的sn-p...

    var chart_div = document.getElementById('chart_div');
    var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
    
    google.visualization.events.addListener(chart, 'ready', function () {
      chart_div.innerHTML = '<img alt="chart" src="' + chart.getImageURI() + '" />';
    });
    

    编辑

    所以我认为它应该像这样流动......

    3 页 --

    1. 图表的html页面
    2. getData.php
    3. buildPDF.php

    html页面调用getData.php并绘制图表

    然后当'ready' 事件触发时,通过ajax 将图像uri 发送到buildPDF.php

    google.visualization.events.addListener(chart, 'ready', function () {
      var imageURI = chart.getImageURI();
      chart_div.innerHTML = '<img alt="chart" src="' + imageURI + '" />';
    
      // send chart image
      $.ajax({
        type: 'POST',
        url: 'buildPDF.php',
        data: {
          'chartImage': imageURI,
        },
        success: function() {
          console.log('image sent');
        }
      });
    });
    

    然后在 buildPDF.php...

    $rep_table .= " <html><img src='".$_POST['chartImage']."' />"
    

    【讨论】:

    • 是的,我只想显示图像。那么我如何将它插入到 HTML 报告中呢?与 chart_div 一样吗?
    • 啊,是的,对不起。你是对的,它确实在 HTML 页面上放置了一个图像。不幸的是,它并不能解决已发送的 DOMPDF 标题问题
    • 请查看编辑,只是添加了更多代码。如果您希望我也包含 getData.php 代码,请告诉我
    • 生成pdf的代码,最近在上面添加的,什么时候运行? -- 我认为如果你绘制图表,那么当'ready' 事件触发时,获取图表image uri。然后通过 ajax 将 image uri 发送到生成 pdf 的 php 页面 -- 在 pdf 代码中,将 image uri 添加到 &lt;img/&gt;src 属性标记...
    • 我会试一试,但我认为这就是问题所在,dompdf 似乎将 AJAX 响应视为标题并停止生成 PDF。尝试此解决方案后,我会更新您
    猜你喜欢
    • 2018-10-13
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 2020-07-24
    • 2018-02-10
    相关资源
    最近更新 更多