开发者社区 问答 正文

在Laravel中创建PDF时使用HTML

我正在使用Laravel创建一个具有允许您从正在查看的页面(即培训课程)中下载包含详细信息的PDF的网站。

我使用barryvdh / laravel-dompdf软件包。

$data["overview"] = $course[0]['overview__c'];

$pdf = PDF::loadView('pdf.course', $data); $ data数组被传递到'pdf.course'刀片文件中,并且其中的值包含HTML代码/标签。

创建/下载PDF时,内部数据不会呈现HTML代码,而是仅显示标签,而使PDF完全未格式化。

似乎任何HTML代码都必须是刀片文件的一部分,并且不能来自传递给它的$ data。

有人有任何解决方案或解决方法让我尝试吗?

展开
收起
社区秘书 2019-11-19 14:24:42 638 分享 版权
阿里云 AI 助理回答

在使用barryvdh/laravel-dompdf时,确实存在将HTML内容从外部数据正确渲染到PDF中的挑战。通常,DOMPDF直接在Blade模板中处理HTML标签,而从变量传递的HTML可能不会被正确解析。但是,有几种方法可以尝试解决这个问题:

1. 使用 {!! !!} 输出原始HTML

确保在Blade模板文件(例如pdf.course)中,你使用了 {!! !!} 来输出未经转义的HTML代码。这样DOMPDF会将其作为HTML来解析而不是文本。

例如,在你的Blade模板中:

{!! $overview !!}

这告诉Blade不要转义 $overview 变量中的内容,允许DOMPDF识别并渲染HTML标签。

2. 预先解析HTML

如果直接在Blade模板中使用 {!! !!} 仍然不工作,你可以尝试在生成PDF之前预先将HTML字符串解析为DOM元素,然后再传递给PDF生成器。虽然Laravel本身没有内置这个功能,但你可以使用PHP的DOMDocument类来实现。

示例代码:

$data["overview"] = $course[0]['overview__c'];
$dom = new \DOMDocument();
libxml_use_internal_errors(true); // 禁用错误报告,以防止警告和提示
$dom->loadHTML($data['overview'], LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$overviewCleaned = $dom->saveHTML();
$data["overview"] = $overviewCleaned;

$pdf = PDF::loadView('pdf.course', $data);

这段代码首先创建了一个新的DOMDocument对象,然后加载了包含HTML的字符串,最后保存并清理了HTML,以便它能更好地与DOMPDF一起工作。

3. 使用其他库或服务

如果上述方法都不能满足需求,考虑使用其他PDF生成库,如snappy(基于wkhtmltopdf),它对HTML和CSS的支持更好,特别是当涉及到复杂的布局和样式时。

安装laravel-snappy:

composer require barryvdh/laravel-snappy

配置并使用它来生成PDF,它能够很好地处理通过变量传递的HTML内容。

请记住,每种方法都有其优缺点,选择最适合你项目需求的方法。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
PHP
问答地址: