我正在使用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。
有人有任何解决方案或解决方法让我尝试吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在使用barryvdh/laravel-dompdf
时,确实存在将HTML内容从外部数据正确渲染到PDF中的挑战。通常,DOMPDF直接在Blade模板中处理HTML标签,而从变量传递的HTML可能不会被正确解析。但是,有几种方法可以尝试解决这个问题:
{!! !!}
输出原始HTML确保在Blade模板文件(例如pdf.course
)中,你使用了 {!! !!}
来输出未经转义的HTML代码。这样DOMPDF会将其作为HTML来解析而不是文本。
例如,在你的Blade模板中:
{!! $overview !!}
这告诉Blade不要转义 $overview
变量中的内容,允许DOMPDF识别并渲染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一起工作。
如果上述方法都不能满足需求,考虑使用其他PDF生成库,如snappy
(基于wkhtmltopdf),它对HTML和CSS的支持更好,特别是当涉及到复杂的布局和样式时。
安装laravel-snappy
:
composer require barryvdh/laravel-snappy
配置并使用它来生成PDF,它能够很好地处理通过变量传递的HTML内容。
请记住,每种方法都有其优缺点,选择最适合你项目需求的方法。