Laravel5.8 利用 snappyPDF 生成PDF文件

news/2025/9/27 19:51:12/文章来源:https://www.cnblogs.com/ljbguanli/p/19115559

Laravel5.8 利用 snappyPDF 生成PDF文件

  • 背景

    最近在设计网站功能时,想要将模板页面生成 pdf 文件,方便用户下载使用
    对比 domPdf 发现 snappyPdf 的性能更满足我的需求
    在此 进行配置

  • 概况
    wkhtmltopdf 是一个开源项目,它的目的是为了解决网页转 PDF 的问题。
    它的核心是一个命令行工具,可以将 HTML 内容渲染为 PDF 格式。
    由于它使用了 Webkit 引擎,因此能够高度保真地转换 HTML 内容,包括 CSS 样式和 JavaScript 动态效果。
    Snappy 是基于 wkhtmltopdf/wkhtmltoimage 的 PHP 封装库,提供以下核心能力:

  • 功能对比

曾对 同一个合同页面 生成pdf文件时,对比发下:
domPdf 生成时间长,文件大小超过15M,且部分css样式需调整;但 snappy 明显快的多,且文件大小仅有105KB,渲染效果好

  • 参考博文

    Laravel Snappy PDF生成实战指南
    Snappy:PHP开发者必备的HTML转PDF/图片生成神器

  • 环境

PHP版本:php 7.2.3
Laravel 版本:Laravel5.8

安装步骤

根据网上经验,结合鄙人的实际操作,在此记录一下 整体的安装使用步骤…

① 安装 wkhtmltopdf 和 SnappyPDF 库

通过 网上经验发现,最为匹配的 版本为:0.4.8

a. window系统

  • snappy 库依赖安装配置
composer require barryvdh/laravel-snappy:0.4.8
  • 如果是在Windows系统需要安装 wkhtmltopdf。
    可以从 wkhtmltopdf 的官方 GitHub 页面下载预编译的二进制文件。选择适合的 Windows 版本的版本下载。

  • 因为官网有时下载效率太慢,提供下载分享 【 >>> 链接: 软件分享 wkhtmltopdf (提取码: 8fj9)

  • 下载后,解压文件,并将解压后的文件夹路径添加到系统的环境变量【PATH】中,这样你就可以在命令行中直接使用 wkhtmltopdf 命令。(可百度查询配置方式)

  • 需要指定完整的wkhtmltopdf的可执行文件路径。例如:'binary' => 'D:\\software\\wkhtmltopdf\\bin\\wkhtmltopdf.exe',

b. Linux或Mac系统 (以 Linux (CentOS7)操作系统,执行配置)

  • snappy 库依赖安装配置
composer require h4cc/wkhtmltopdf-amd64
composer require barryvdh/laravel-snappy:0.4.8
  • 对于Linux 或 Mac 系统,可能需要通过包管理器安装 wkhtmltopdf,然后填写相应的路径。
#下载 wkhtmltopdf
[root@applet-server opt]# wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
#解压:使用 tar xvfJ 命令解压
[root@applet-server opt]# tar xvfJ wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
#cd到wkhtmltox/bin目录下
[root@applet-server opt]# cd wkhtmltox/bin
#将wkhtmltox/bin目录下的“wkhtmltopdf”命令文件拷贝到 /usr/local/bin/下
[root@applet-server wkhtmltopdf]# cp ./wkhtmltopdf /usr/local/bin/wkhtmltopdf
[root@applet-server wkhtmltopdf]# cp ./wkhtmltoimage /usr/local/bin/wkhtmltoimage
#添加执行权限
[root@applet-server wkhtmltopdf]# cd /usr/local/bin/
[root@applet-server bin]# chmod +x ./wkhtmltopdf
[root@applet-server bin]# chmod +x ./wkhtmltoimage
[root@applet-server bin]# chmod 777 ./wkhtmltopdf
[root@applet-server bin]# chmod 777 ./wkhtmltoimage
//测试 ,如果在/usr/local/bin/下生成“test.pdf”则表示成功
[root@applet-server bin]# wkhtmltopdf http://www.baidu.com ./test.pdf

③. 配置 Laravel

  • app.php 补充配置信息如下:
//添加服务提供者
'providers' =>
[
Barryvdh\Snappy\ServiceProvider::class,
],
//添加门面
'aliases' =>
[
'SnappyPDF' =>
Barryvdh\Snappy\Facades\SnappyPdf::class,
]
  • config/snappy.php 配置信息如下:
<?php
return [
'pdf' =>
[
'enabled' =>
true,
'binary' =>
'/usr/local/bin/wkhtmltopdf',
//'binary' => 'D:\\software\\wkhtmltopdf\\bin\\wkhtmltopdf.exe', //windows安装路径
'timeout' =>
false,
'options' =>
[],
'env' =>
[],
],
'image' =>
[
'enabled' =>
true,
'binary' =>
'/usr/local/bin/wkhtmltopdf',
'timeout' =>
false,
'options' =>
[],
'env' =>
[],
],
];

④. 使用 SnappyPDF

  • 创建一个控制器方法来生成 PDF:
<?php
namespace App\Http\Controllers;
use PDF;
// 使用 Facade
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class PdfController
extends Controller
{
public function generatePdf()
{
//...
$pdf = PDF::loadView('pdf.invoice', $view_data);
// 加载视图和数据生成 PDF
return $pdf->
download('invoice.pdf');
// 返回下载的 PDF 文件
}
}
  • 对应的模板文件 pdf.invoice.blade,参考示例代码如下:
<
!-- pdf-with-image.blade.php -->
<img src="{{ $imagePath }}" alt="示例图片" />

⑤. 清除缓存(可选)

  • 如果你在配置过程中遇到问题,尝试运行以下命令来清除 Laravel 的配置缓存:
php artisan config:clear
php artisan cache:clear

附录

1. 性能优化的方法和策略

减少外部资源加载 :尽量减少PDF中加载外部图像或CSS的次数,因为这些请求会增加生成PDF的时间。
使用队列处理 :对于大量或复杂的PDF生成任务,可以使用Laravel的队列系统异步处理,避免阻塞主进程。
优化HTML模板 :确保生成PDF所用的HTML模板尽可能简洁高效,避免不必要的DOM结构。

2. 支持动态内容的方法和步骤

  • 要支持动态内容,例如JavaScript执行后的元素或实时数据,可以使用 --load-error-handling 和 --no-sandbox 选项。
$html = view('dynamic-content', [...]);
// 调用 wkhtmltopdf 的命令行选项
$cmdOptions = ['--load-error-handling', 'ignore'];
$this->
pdf->
setOptions($cmdOptions);
return $this->
pdf->
getOutputFromHtml($html);

3. 发现如果表格数据特别多,分页后,可能会出现 跨页的顶部导航栏与表格数据重合

  • 测试发现,有个最简单的解决方案:你可以通过 CSS 来优化表格的布局,使其更适合跨页显示
<style type="text/css">th, td, tr {page-break-inside: avoid;/* 防止内容跨页断裂 */}
</style>

4. 辅助指令

#查看wkhtmltopdf的版本
[root@b1bweb-uat uat.b1b.com]# wkhtmltopdf --version
wkhtmltopdf 0.12.4 (with patched qt)
#查看 wkhtmltopdf 的命令路径
[root@b1bweb-uat uat.b1b.com]# whereis wkhtmltopdf
wkhtmltopdf: /usr/local/bin/wkhtmltopdf
#查看已安装的字体
[root@b1bweb-uat uat.b1b.com]# fc-list :lang=zh
/usr/share/fonts/simsun.ttf: SimSun:style=Regular

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/919863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

幼儿做爰网站什么是网站推广优化

原标题&#xff1a;2019届呼和浩特市高三段考成绩排名分析不忘初心 天道酬勤╳✎校对&#xff1a;刘姝坤✎文稿&#xff1a;王涛老师✎声明&#xff1a;如有转载请联系并注明出处好乐(巨人)教育2019高三普文理集训段考班火热招生中全呼市唯一一家吃住学一体封闭式管理的学校唯一…

西城网站建设浩森宇特沈阳单页网站制作

Powered by:NEFU AB-IN 文章目录 Go 语言的实战案例 SOCKS5 代理 | 青训营 引入TCP echo serverauth 认证请求阶段relay阶段 Go 语言的实战案例 SOCKS5 代理 | 青训营 GO语言工程实践课后作业&#xff1a;实现思路、代码以及路径记录 引入 代理是指在计算机网络中&#xff…

数据结构——链表 - 详解

数据结构——链表 - 详解2025-09-27 19:42 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…

25秋周总结4

总结 上周的两场联考我觉得考得很烂,其实难度和之前我打 200、300 是差不多的,但是为什么自己打得如此糟糕呢?我认为是自己思考问题的方式有问题,导致我的发挥不稳定。就像我在联考总结里面说的:我的思路历程在前…

html静态网站开发个人博客微商城 手机网站

目录 Tensor在神经网络中的角色 实现权重聚合的算法 1. Tensor的基本概念 2. Tensor的数据结构举例 一维Tensor(向量) 二维Tensor(矩阵) 三维及以上Tensor 3. Tensor的内部结构 4. Tensor的操作 Tensor数据结构示例 示例Tensor内容(部分) model.state_dict(…

Python 潮流周刊#121:工程师如何做出高效决策?

本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 温馨提…

饥荒联机版

info 角色属性 血量 饱食度 精神值 mod 1-Combined Status(状态显示增加); 2-Minimap(小地图); 3-MOD,Global Positions(全球定位); 4-Health Info; 5-简易血条显示; 6-Geometric Placement(几何定位); …

LinuxC++项目开发日志——基于正倒排索引的boost搜索引擎(5——通过cpp-httplib库建立网页模块) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

前端做网站需要的技能wordpress文章关键词插件

Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑&#xff0c;然后在网上看到这篇文章&#xff1a;Java Array to List Examples 感觉挺不错的&#xff0c;但是还不是特别全面。所以&#xff0c;自己对于这块小知识点进行了简单的总结。 简介 Arrays.asList()…

iSCSI网络存储——基于VM17下麒麟V10SP1与SP2的共享配置

iSCSI网络存储——基于VM17下麒麟V10SP1与SP2的共享配置本文适合零基础的Linux新手,通过详细的步骤和实际输出示例,教你如何在VMware虚拟机中搭建iSCSI网络存储环境。📖 教程前言 作为一名Linux新手,你是否曾经好…

微信二次开发文档

微信二次开发文档目前微信社群比较火,市面上社群管理工具也是有各式各样的,但是最终都不开微信的协议,协议样式也有很多,例如web、PC Hook、模拟机、Xposed等。但是目前各类协议的稳定性有待考究。 目前稳定不封号…

网站空间购买价格用ps怎么做学校网站页面

网页图表Highcharts实践教程之标签组与载入动画 Highcharts标签组 在图表的大部分元素都提供了标签功能。但很多时候&#xff0c;我们需要额外说明一些信息。这个时候借助原有的图表元素的标签功能就不是很方便。Highcharts为用户提供了标签组功能。使用该功能可以在图表区的任…

寺院网站建设用个人电脑做网站的步骤

mysql日志管理、备份与恢复 一、数据备份重要性数据备份类型二、数据库备份类型2.1物理备份1.冷备份(脱机备份):2.热备份(联机备份)∶3.温备份: 2.2逻辑备份1.完全备份2.差异备份3.增量备份 三、常见的备份方法3.1物理冷备3.2专用备份工具3.3启用二进制日志进行增量备份3.4第三…

CSP-S1 2025

邮寄J组没报(。) 中午吃饭不知道吃了什么神秘小零食,下午坐车的时候晕车比平常严重很多,而且恶心。最终还是没忍住,在车上进行了一个吐的催...(忏悔) 存疑食物:unk_菜叶子,那一年の_鱿鱼,隔夜の米饭,神秘海…

手机模板的网站哪个好网站建设中首页模板下载

1. 简述 我们使用OpenCV时&#xff0c;有时会在图像的某个位置绘制OSD信息&#xff0c;如绘制一些字符串作为指示信息。 本文将简要介绍在图像&#xff08;cv::Mat&#xff09;上绘制固定的字符串信息。 2. 使用的API &#xff08;1&#xff09;cv::getTextSize() CV_EXPORT…

北京正邦网站建设建设公司网站哪家好

8月31日&#xff0c;AUTOSEMO“恒以致远&#xff0c;共创共赢”主题研讨会在天津成功召开。本次大会由中国汽车工业协会软件分会中国汽车基础软件生态标委会&#xff08;简称&#xff1a;AUTOSEMO&#xff09;与天津市西青区人民政府联合主办。现场汇聚了100余位来自产学研政企…

金币

//题意:国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币; //之后两天(第二天和第三天)里,每天收到两枚金币;之后三天(第四、五、六天)里, //每天收到三枚金币;之后四天(第七、八、九、十天…

【阿里DeepResearch】写作组件WebWeaver详解 - 指南

【阿里DeepResearch】写作组件WebWeaver详解 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

常宁市住房和城乡建设局网站简洁大气公司网站

Apache Tomcat - Apache Tomcat 8 Software Downloadshttps://tomcat.apache.org/download-80.cgi2.找到Archives 3.选择下载的把版本 4.选择具体下载那个版本 5. 6.一般选择tar.gz结尾的压缩包

【远程桌面】运维强推设备之远程控制软件RustDesk 1.4.1 全面指南:开源远程桌面的终极解决方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …