Laravel - 将 TailwindCSS 样式的视图输出为 PDF

Posted

技术标签:

【中文标题】Laravel - 将 TailwindCSS 样式的视图输出为 PDF【英文标题】:Laravel - Outputting a view styled with TailwindCSS as PDF 【发布时间】:2021-08-16 04:40:00 【问题描述】:

我正在尝试从视图中生成 pdf,但样式不会出来。我尝试过使用 3 个不同的库,但结果差别不大。我错过了什么吗?

view

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Test View</title>
  <link rel="stylesheet" type="text/css" media="screen" href=" asset('css/app.css') ">
  <script src=" asset('js/app.js') " defer></script>
</head>
<body class="font-sans antialiased">

<div class="grid grid-cols-3">
  <div class="bg-red-200 col-span-2 h-screen"></div>
  <div class="bg-blue-200 h-screen">
    <div class="grid grid-cols-8">
      <div class="col-span-7">
        <div class="rounded-t-full w-full h-screen flex items-center justify-center bg-green-600">
          <div class="h-60 w-60 rounded-full bg-blue-500">TEST</div>
        </div>
      </div>
    </div>
  </div>
</div>

</body>
</html>

appearance


dompdf export method

protected function dompdfImplementation()

    $dompdf = new Dompdf;
    $dompdf->getOptions()->setChroot(public_path());
    $dompdf->loadHtml(view('view')->render());

    $dompdf->stream('view.pdf', ['Attachment' => false]);

dompdf export result


mpdf export method

protected function mpdfImplementation()

    $mpdf = new Mpdf;
    $mpdf->WriteHTML(view('view')->render());

    $mpdf->output();

mpdf export result


tcpdf export method

protected function tcpdfImplementation()

    $tcpdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $tcpdf->AddPage();
    $tcpdf->writeHTML(view('view')->render());

    $tcpdf->Output('view.pdf', 'I');

tcpdf export result


没有css内联就不能将视图导出为pdf吗?

我最好手动截取整页屏幕截图,将其粘贴到文本文档中并将其保存为 pdf 文件?

【问题讨论】:

你是通过Tailwind Docs # Styling for print还是自己写custom css with @media rule 将样式表限定为media="print" 似乎也不起作用。我想我会寻找一个内联。 【参考方案1】:

这个包就像一个魅力(像往常一样使用 spatie): https://github.com/spatie/browsershot

根据文档:

该软件包可以将网页转换为图像或 pdf。转换 由控制无头的 Puppeteer 在幕后完成 谷歌浏览器版本。

【讨论】:

【参考方案2】:

如果您需要支持现代 CSS 功能,例如 flexbox,我想您的 Tailwind 示例使用了这些功能,您最好使用 headless chrome(或稍旧的 wkhtmltopdf)来生成 PDF。

一个使用chrome-php/chrome的例子:


<?php

use HeadlessChromium\BrowserFactory;
use HeadlessChromium\Page;

require_once __DIR__ . '/vendor/autoload.php';

$browserFactory = new BrowserFactory();

$browser = $browserFactory->createBrowser([
    'noSandbox' => true,
    'customFlags' => [
        '--proxy-server="direct://"',
        '--proxy-bypass-list=*',
        '--font-render-hinting=none',
    ],
]);

$page = $browser->createPage();

$tempname = '//<path to your HTML over HTTP>';

$page->navigate('file://' . $tempname)
    ->waitForNavigation(Page::NETWORK_IDLE);

$outputPath = __DIR__ . '/output.pdf';

$page->pdf([
    'printBackground' => true,
    'preferCSSPageSize' => true,
    'marginTop' => 0.4,
    'marginBottom' => 0.2,
    'marginLeft' => 0.2,
    'marginRight' => 0.2,
])->saveToFile($outputPath);

使用 PHP PDF 库来利用它们相对于浏览器方法的一些优势 - 颜色处理、预打印、条形码支持、页眉和页脚、页码、TOC 等,但考虑到它们对 HTML 和 CSS 的支持,期望一个量身定制的很可能需要模板和样式表。

当然,当您无法通过托管服务提供商运行 PHP 以外的其他软件时,上一段也适用。

【讨论】:

这是一个个人项目,所以我并不严格需要它是完全自动的。我不确定如何使用无头镀铬来实现我想要的。你能详细说明一下吗?我刚试过wkhtmltopdf,结果是一样的。 (只是文字,没有样式) github.com/chrome-php/headless-chromium-php 那个库看起来很有前途,可惜它没有被维护,只是不起作用。 还有很多,随便挑。自己做一些工作。 packagist.org/packages/chrome-php/chrome 我明天会尝试该代码,但我上次尝试 chrome-php 时并没有超过 createBrowser() 的阶段。它向我抛出了关于浏览器未启动并深入研究源代码的错误,显示它没有正确支持 windows 。乍一看确实如此,但例如库创建浏览器的第一步是检查 chrome 版本......使用在 Windows 中无意义的命令,导致超时。即使注释掉整个部分或将超时时间增加三倍也无济于事。【参考方案3】:

之后

尝试barryvdh/laravel-dompdf 而不是dompdf/dompdf 在我的样式表上使用media="print" 使用 TailwindCSS 的 print:* 类 试图让chrome-php 工作无济于事 正在尝试 barryvdh/excel 的 pdf 导出。

没有任何效果,所以我得到的解决方案很糟糕。

    在 Firefox 中打开视图。 屏幕截图整个页面(不仅仅是可见内容)。 使用我找到的第一个在线 PNG 到 PDF 转换器。

我希望有一种不那么痛苦的方法来做到这一点,但看起来不像。这个糟糕的解决方案确实有效。

【讨论】:

如果这是一个可接受的解决方案,为什么不直接使用 PDFCreator 将页面打印为 PDF? 这可能是一个解决方案,但我不熟悉该软件。这是我第一次听说。 如果它有效,我认为它也是一个可以接受的解决方案。

以上是关于Laravel - 将 TailwindCSS 样式的视图输出为 PDF的主要内容,如果未能解决你的问题,请参考以下文章

Laravel + Tailwindcss 1.8.7:如何安装

Laravel TailwindCSS 添加更多颜色不起作用

Laravel Mix、TailwindCSS 和 PurgeCSS

我正在使用 Bootstrap 和 Tailwind CSS 开发 Laravel。我的tailwindcss没有被选中

Laravel 中的 Tailwind 3 给出:错误:PostCSS 插件 tailwindcss 需要 PostCSS 8

如何在 Laravel TailwindCss Vue Js 项目中添加和使用本地自定义字体?