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

rwqw0loc  于 8个月前  发布在  其他
关注(0)|答案(4)|浏览(67)

我尝试从视图生成PDF,但样式就是不出来。我尝试使用3个不同的库,但结果没有太大不同。我错过了什么吗?
第一个月

<!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 inliner就不能将视图导出到pdf吗?
我是不是最好手动截取一个完整的页面截图,粘贴到文本文档中,然后保存为pdf文件?

zkure5ic

zkure5ic1#

这个软件包工作起来就像一个护身符(和spatie一样):https://github.com/spatie/browsershot
根据医生的说法:
该软件包可以将网页转换为图像或PDF格式。转换是在幕后由 puppet 师完成的, puppet 师控制着无头版本的谷歌Chrome。

xmq68pz9

xmq68pz92#

如果您需要支持现代CSS功能,如flexbox,我想您的Tailwind示例使用了它,那么最好使用无头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以外的其他软件与您的托管服务提供商。

8nuwlpux

8nuwlpux3#

这个答案可以解决问题:https://stackoverflow.com/a/36695827/5540654
基本上,您需要在文档的head中添加base标记。

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

字符串
我用wkhtmltopdf工作过,可能也是类似的问题。

4nkexdtk

4nkexdtk4#

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

没有什么工作,所以我得到的解决方案是一个坏的。
1.在Firefox中打开视图。
1.截图整个页面(不只是可见内容)。
1.使用我找到的第一个在线PNG到PDF转换器。
我希望有一个不那么痛苦的方法来做这件事,但它看起来不像。这个糟糕的解决方案实际上有效。

相关问题