【问题标题】:Laravel:Trying to generate pdf with charts but on generated pdf charts are not showingLaravel:尝试使用图表生成 pdf,但生成的 pdf 图表未显示
【发布时间】:2019-02-06 16:02:47
【问题描述】:

我已经安装了 laravel 5.6 并安装了 barryvdh/laravel-dompdf 包。我使用了一些 jquery 图表插件在刀片文件上显示图表,它工作正常。通过使用 dompdf 包,我试图在 pdf 上显示这个饼图,但图表没有显示在 pdf 上。如何在 pdf 上显示图表,有什么解决方案可以在流媒体/下载 pdf 上显示图表吗?

图表插件/库在查看刀片文件时显示以下图表:

我正在尝试在流式传输/下载的 pdf 上显示此图表

代码如下:
控制器代码:

public function generate_pdf(){

        $data = [
        'foo' => 'bar'
    ];


    //return view('pdf');

    $pdf = PDF::loadView('pdf', $data);
    return $pdf->stream('document.pdf');
}

pdf.blade.php 代码:

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Create</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="{{ asset('public/js/piechart.js') }}"></script>


    <script>

window.onload = createPieChart;
function createPieChart() {

    var pieChart = new PieChart( "piechart", 
        {
            includeLabels: true, 
            data: [40, 250, 70],
            labels: ["11%", "69.6%", "17.4%"],
            colors: [
                ["#FFDAB9", "#FFDAB9"],
                ["#E6E6FA", "#E6E6FA"],
                ["#E0FFFF", "#E0FFFF"]
            ]
        }
    );

    pieChart.draw();

}
</script>

    </head>
    <body>

    <canvas id="piechart" width="400" height="400">
    </canvas>

    </body>
</html>

【问题讨论】:

  • 由于不兼容问题,您在尝试使 dompdf 与外部 jquery 库一起工作时会遇到很多问题。您可以做的是检查 dompds 的要求,即它可以转换的 html 代码中的内容,然后检查该 jquery 插件生成和操作的 html 是否满足这些要求。但我敢打赌你会遇到很多困难,因为 dompdf 已经过时了,而且实际上从来没有支持过很多高级 jquery 对 html 树的干扰。
  • OK...任何其他将带有图表和图形的刀片文件html转换为pdf的解决方案..?或任何其他 laravel 包,或任何 php 解决方案或 jquery 插件解决方案?

标签: javascript laravel pdf pie-chart dompdf


【解决方案1】:

经典问题 - 不容易解决

这是一个经典问题。它影响许多不同的工具,而不仅仅是 dompdf。至少涉及三个问题:

  • Javascript

服务器端工具可以处理生成的 HTML,但通常运行 Javascript。它将 HTML 和 CSS 解释为好像禁用了 Javascript 的浏览器一样,因此 jQuery 和许多其他 Javascript 库根本无法工作,因此无法捕获客户端生成的任何图形。

客户端工具可以在所有 Javascript(jQuery 或其他)完成后运行。但是,还有其他问题……

  • SVG(和其他图形)

有多种方法可以在浏览器中呈现图形。老式的方法是在服务器上生成图形,然后将 jpg 或 png 图像下载到浏览器中。但是,它不提供动态图表(无论如何都不容易)、详细的鼠标悬停动作等。所以现在大多数网站都使用 SVG 或其他客户端系统。当前所有(或几乎所有)浏览器都支持 SVG,因此它在很大程度上取代了旧方法。 SVG(以及较旧的方法)不容易捕获以呈现为 PDF 或其他文档。因此,即使使用客户端系统,您通常也会在图形所在的位置出现“洞”。

  • 分辨率

在生成客户端 SVG 图表时,所有内容的大小都基于您的屏幕分辨率。如果您确实设法将该图表与 HTML 一起捕获,则文本将是高分辨率的(因为它是文本并且可以被视为具有可缩放字体的 PDF 中的文本),但图形将被限制为最初绘制的分辨率。这对于临时使用来说很好,但在高质量打印机上打印时可能无法产生所需或期望的质量。典型的屏幕分辨率约为 100dpi,典型的打印机分辨率约为 200dpi - 300dpi(额定值要高得多,但从实际的角度来看,以 200dpi 或更高的分辨率渲染的彩色图像通常令人满意,但艺术品质的照片除外)。

虚拟浏览器图像捕获

到目前为止,我发现的最佳解决方案是使用虚拟或“无头”浏览器来创建所有内容 - 运行 Javascript 并生成 SVG 输出以及 HTML 和 CSS。然后将输出捕获为高分辨率图像以插入 PDF。您可以使用任何服务器端框架/工具包/等。同时进行捕获和创建 PDF。

有免费的开源软件包可用。可能最受欢迎的是PhantomJS,但我刚刚检查过它目前已存档/未激活。我已经使用它并且它有效,但是有很多问题。

还提供各种服务。我目前使用的是URLBox.io。我对此没有个人兴趣——只是一个非常满意的客户。它包括用于将图像保存到 Amazon S3 的选项(取决于订阅类型),或者您可以在本地捕获。对我来说,最重要的是你可以设置非常高的分辨率,这样拍摄的图像看起来真的很棒。我主要使用它来将网页图像自动插入 PDF。

【讨论】:

  • OK..fine,有没有其他解决方案可以将带有图表、图形表示的 html 页面转换为 pdf 格式的正确格式,就像在 html 中一样。?
  • PhantomJS 可能是几年前最流行的,但是现在它已经被抛弃了。我建议 headless chrome 代替它,它基本上是 Chrome 的无头版本,只要 Chrome 支持,它就可能会受到支持。
  • @MuhammadRizwan 我发现实际上工作的一切都基于某种虚拟/无头浏览器,无论是在本地(在您自己的服务器上)还是通过服务(例如URLBox.io)。我没有使用过 headless chrome ,但它的操作方式似乎大致相同。不幸的是,我还没有看到任何接近插件库(服务器或客户端)的东西可以作为替代方案。
  • 有一个 css-2-pdf stackoverflow 标签。我是那个软件的创造者。如果你愿意,你可以在那里发帖。或者离线访问网站并向我们发送电子邮件,我们可以帮助您调试并获得结果。然而,这是一个在浏览器中格式化 PDF 的请求,而不是一个处理了 JS 库的 HTML 到 PDF 的转换,而且所有这些都没有在浏览器中。我们抓取所有 JS 等(包括 SVG 图表)处理的浏览器的 DOM,并通过转换为 XSL FO 并使用该技术在远程服务器中格式化该 DOM(序列化为 XML)。这可能不符合您的要求
  • 我只是对答案发表评论,因为@cloudformatter 解决方案是专门为解决上述两个问题而创建的...... SVG 和分辨率,两者都不是问题。我们在服务器本机(作为矢量)上格式化 SVG,因此为包含的 SVG 提供最佳结果。
猜你喜欢
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 2020-01-08
  • 2015-04-23
  • 2017-03-29
  • 2021-10-19
相关资源
最近更新 更多