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

问题描述 投票:0回答:4

我正在尝试从视图生成 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 文件?

laravel tcpdf dompdf tailwind-css mpdf
4个回答
2
投票

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

根据医生的说法:

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


0
投票

如果您需要支持现代CSS功能,例如flexbox(我想您的Tailwind示例使用了flexbox),那么最好使用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 库可以利用其相对于浏览器方法的一些优势 - 颜色处理、预打印、条形码支持、页眉和页脚、页码、目录等,但考虑到它们对 HTML 和 CSS 的支持,需要定制模板和很可能需要样式表。

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


0
投票

这个答案可能会解决问题: https://stackoverflow.com/a/36695827/5540654

基本上,您需要在文档的

base
中添加
head
标签。

<html>
<head>
...
<base href="http://www.example.com/">
<link href="/assets/css/style.css" rel="stylesheet">
...
</head>

使用 wkhtmltopdf 为我工作。可能是类似的问题。


-6
投票

之后

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

没有任何效果,所以我达到的解决方案是一个糟糕的解决方案。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.