一文讲解Laravel-snappy如何导出PDF

下面由laravel教程栏目给大家介绍如何使用laravel-snappy导出pdf,希望对需要的朋友有所帮助!

前言

论坛里有很多关于如何使用 Laravel-snappy 的文章,但是很多都停留在安装、基本示例,对于实际的应用既没有说明用法,也没有解答一些问题和疑惑,因此在此整理一下,权当做个记录吧。

安装

以 ubuntu 为例

1. 执行安装 wkhtmltopdf:

composer require h4cc/wkhtmltopdf-amd64 0.12.xcomposer require h4cc/wkhtmltoimage-amd64 0.12.x

顾名思义,分别安装的是 wkhtmltopdf 和 wkhtmltoimage。

2. 复制 wkhtmltopdf 到 ubuntu 可执行命令的目录中

sudo cp vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64 /usr/local/bin/sudo cp vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64 /usr/local/bin///并使其可执行:sudo chmod +x /usr/local/bin/wkhtmltoimage-amd64 sudo chmod +x /usr/local/bin/wkhtmltopdf-amd64

3. 安装 laravel-snappy

composer require barryvdh/laravel-snappy

4. 将 ServiceProvider 添加到 config/app.php 中的 providers 数组中

BarryvdhSnappyServiceProvider::class

5. 将 Facades 添加到 config/app.php 中的 aliases 数组中

'PDF' => BarryvdhSnappyFacadesSnappyPdf::class,'SnappyImage' => BarryvdhSnappyFacadesSnappyImage::class,

6. 执行生成配置文件

小文AI论文 小文AI论文

轻松解决论文写作难题,AI论文助您一键完成,仅需一杯咖啡时间,即可轻松问鼎学术高峰!

小文AI论文 69 查看详情 小文AI论文

php artisan vendor:publish --provider="BarryvdhSnappyServiceProvider"

可以看到默认的配置文件为 config/snappy.php:

return [    'pdf' => [        'enabled' => true,        'binary'  => env('WKHTML_PDF_BINARY', '/usr/local/bin/wkhtmltopdf'),        'timeout' => false,        'options' => [],        'env'     => [],    ],    'image' => [        'enabled' => true,        'binary'  => env('WKHTML_IMG_BINARY', '/usr/local/bin/wkhtmltoimage'),        'timeout' => false,        'options' => [],        'env'     => [],    ],];

注意,这里有个坑,默认 binary 配置为 /usr/local/bin/wkhtmltopdf 和 /usr/local/bin/wkhtmltoimage,在第一次使用的时候,会报错 /usr/local/bin/wkhtmltopdf不存在,这是因为在 linux 系统下,wkhtmltopdf 和 wkhtmltoimage 的真实路径和名称为:/usr/local/bin/wkhtmltopdf-amd64 和 /usr/local/bin/wkhtmltoimage-amd64。

9fd04814e680ba64faa47e2f0b24460.png

因此,需要把配置信息修改为:

'pdf' => [        ...        'binary'  => env('WKHTML_PDF_BINARY', '/usr/local/bin/wkhtmltopdf-amd64'),        ...    ],    'image' => [        ...        'binary'  => env('WKHTML_IMG_BINARY', '/usr/local/bin/wkhtmltoimage-amd64'),        ...    ],

开始使用

//使用方法1$pdf = PDF::loadView('welcome', $data);return $pdf->download('welcome.pdf');//使用方法2$html = '

订单id

12346546

';$pdf = PDF::loadHTML($html);return $pdf->inline();

很多博客里没有提到,使用方法 1 中,会报这样的错:

The exit status code '1' says something went wrong: stderr: "Loading pages (1/6) [> ] 0% [======> ] 10% QSslSocket: cannot resolve CRYPTO_num_locks QSslSocket: cannot resolve CRYPTO_set_id_callback QSslSocket: cannot resolve CRYPTO_set_locking_callback QSslSocket: cannot resolve sk_free QSslSocket: cannot resolve sk_num QSslSocket: cannot resolve sk_pop_free QSslSocket: cannot resolve sk_value QSslSocket: cannot resolve SSL_library_init QSslSocket: cannot resolve SSL_load_error_strings QSslSocket: cannot resolve SSLv3_client_method QSslSocket: cannot resolve SSLv23_client_method QSslSocket: cannot resolve SSLv3_server_method QSslSocket: cannot resolve SSLv23_server_method QSslSocket: cannot resolve X509_STORE_CTX_get_chain QSslSocket: cannot resolve OPENSSL_add_all_algorithms_noconf QSslSocket: cannot resolve OPENSSL_add_all_algorithms_conf QSslSocket: cannot resolve SSLeay QSslSocket: cannot call unresolved function CRYPTO_num_locks QSslSocket: cannot call unresolved function CRYPTO_set_id_callback QSslSocket: cannot call unresolved function CRYPTO_set_locking_callback QSslSocket: cannot call unresolved function SSL_library_init QSslSocket: cannot call unresolved function SSLv23_client_method QSslSocket: cannot call unresolved function sk_num [==================> ] 31% QSslSocket: cannot call unresolved function SSLv23_client_method QSslSocket: cannot call unresolved function SSL_library_init [============================================================] 100% Counting pages (2/6) [============================================================] Object 1 of 1 Resolving links (4/6) [============================================================] Object 1 of 1 Loading headers and footers (5/6) Printing pages (6/6) [> ] Preparing [============================================================] Page 1 of 1 Done Exit with code 1 due to network error: UnknownNetworkError QSslSocket: cannot call unresolved function CRYPTO_num_locks QSslSocket: cannot call unresolved function CRYPTO_set_id_callback QSslSocket: cannot call unresolved function CRYPTO_set_locking_callback " stdout: "" command: /usr/local/bin/wkhtmltopdf-amd64 --lowquality '/tmp/knp_snappy612c3edcdfc855.21787864.html' '/tmp/knp_snappy612c3edcdfce49.80482557.pdf'.

执行:

sudo apt-get updatesudo apt install libssl1.0-dev

修复完成,导出 welcome 页面。

如果使用 save () 方法保存,默认保存到 /public 文件夹下,并且如果文件名相同的情况下,第二次保存会提示文件已经存在。

以上就是一文讲解Laravel-snappy如何导出PDF的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/345370.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月5日 20:07:58
下一篇 2025年11月5日 20:09:44

相关推荐

  • GolangWeb表单文件验证与安全实践

    答案:Golang文件上传需验证文件大小、真实类型(魔术字节)、生成安全文件名,并防范路径遍历与DoS攻击。 文件上传在Web应用中是再常见不过的功能了,但它也常常是安全漏洞的温床。在Golang里处理Web表单文件上传,核心在于两点:一是确保上传的文件符合我们的预期(验证),二是全方位地抵御潜在的…

    2025年12月15日
    000
  • GolangHTTP文件上传与下载示例

    答案:Golang通过net/http包实现文件上传下载,上传时解析multipart/form-data表单并保存文件,下载时设置Content-Disposition头并通过io.Copy流式传输。代码示例包含uploadHandler处理POST请求、解析文件、校验类型并保存,download…

    2025年12月15日
    000
  • Golang实现基础邮箱发送工具示例

    使用Golang的net/smtp包可实现基础邮件发送,通过配置SMTP信息、构建邮件内容、认证并发送,结合第三方库如gomail处理附件和HTML,能有效提升开发效率与可靠性。 用Golang实现基础的邮箱发送工具,核心在于利用其标准库 net/smtp ,通过简单的认证和邮件结构拼接,就能快速构…

    2025年12月15日
    000
  • Golang模板方法模式流程控制与应用

    模板方法模式通过接口和组合在Go中实现,定义算法骨架并延迟步骤到子类。使用函数字段或接口注入钩子方法,实现流程控制与具体逻辑分离,适用于任务处理、数据导出等场景,提升代码复用性、可测性与扩展性。 在Go语言中,模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了…

    2025年12月15日
    000
  • 如何使用go mod graph命令可视化Golang项目的依赖树

    go mod graph命令输出项目模块依赖关系,通过Graphviz等工具可将其可视化,帮助识别循环依赖、冗余依赖及评估依赖风险,优化项目结构。 Go mod graph 命令用于输出项目的模块依赖关系图,它可以帮助开发者理解项目的依赖结构,发现潜在的循环依赖或不必要的依赖。简单来说,它能让你看清…

    2025年12月15日
    000
  • Golang path库文件路径拼接与解析方法

    使用path包的Dir、Base和Ext函数可准确提取目录名、文件名和扩展名,避免手动字符串处理带来的错误,提升代码健壮性与可维护性。 Go语言的 path 包提供了一套简洁而强大的工具,用于处理文件路径的拼接、解析和清理,它以平台无关的方式工作,尤其适合处理URL路径或任何以斜杠 / 作为分隔符的…

    2025年12月15日
    000
  • Golang path/filepath库文件路径操作方法

    path/filepath库是Go语言跨平台路径处理的首选,因其自动处理不同操作系统的路径分隔符差异,提供Join、Clean、Dir、Base、Ext、Abs、Rel等函数,实现安全、规范的路径拼接、清理、解析与转换,避免手动拼接导致的兼容性与安全问题,提升代码可移植性与健壮性。 path/fil…

    2025年12月15日
    000
  • Golang mime类型检测 文件类型判断

    使用net/http.DetectContentType读取文件前512字节,通过魔数识别MIME类型,优先于扩展名判断,结合mime.TypeByExtension备用,确保文件处理安全准确。 在Go语言中,判断文件的MIME类型通常用于Web服务中正确设置响应头,或在上传文件时进行类型校验。Go…

    2025年12月15日
    000
  • Golang mime/multipart库文件上传解析示例

    Go语言中处理multipart/form-data文件上传需使用mime/multipart库,通过r.ParseMultipartForm或更高效的r.MultipartReader实现;为保障安全,应限制请求体大小、校验文件类型、重命名文件并防止路径遍历,同时结合http.DetectCont…

    2025年12月15日
    000
  • 在Markdown中集成Python数据:动态内容生成指南

    本文旨在解决如何在Markdown文档中动态展示Python程序生成的数据,而非简单地简单地显示代码块。我们将探讨两种主要方法:一是通过Python程序结合模板引擎(如Jinja2)动态生成Markdown文件,适用于需要更新`README.md`等静态文档的场景;二是利用文学编程工具(如Pweav…

    2025年12月15日
    000
  • python中Beta分布如何理解?

    Beta分布是描述[0,1]区间概率不确定性的连续分布,由参数α和β决定,其PDF为f(p;α,β)=p^(α−1)(1−p)^(β−1)/B(α,β);α和β可视为虚拟的成功与失败次数。例如先验Beta(1,1)表示均匀分布,观测3次成功2次失败后后验为Beta(4,3),峰值约0.57;分布随数…

    2025年12月14日
    000
  • python如何提取文本信息?

    先读取文本内容,再根据结构选择字符串处理、正则表达式或专用库提取信息。1. 读取文件或字符串变量;2. 用split()、find()等方法提取固定格式信息;3. 用re.findall()提取邮箱、电话、日期等规律性信息;4. 对JSON、HTML、PDF等结构化文本分别使用json、Beauti…

    2025年12月14日
    000
  • Python 文件下载功能的实现方法

    使用urllib、requests可实现Python文件下载。urllib无需安装,适合简单场景;requests更灵活,支持流式下载大文件并显示进度,推荐用于常规项目。 Python 实现文件下载功能有多种方式,常用且实用的方法包括使用内置库 urllib、第三方库 requests,以及处理大文…

    2025年12月14日
    000
  • python中pathlib模块的用法有哪些?

    pathlib提供面向对象的路径操作,支持创建路径、拼接、访问组件、判断属性、读写文件、遍历目录、管理目录及获取文件信息,相比os.path更直观且跨平台兼容。 pathlib 是 Python 3.4+ 引入的用于处理文件路径的标准库模块,提供面向对象的方式操作路径,比传统的 os.path 更直…

    2025年12月14日
    000
  • Python 文件上传功能的实现思路

    实现文件上传需通过Web框架接收文件并安全保存。1. 使用Flask等框架处理HTTP请求中的文件字段,前端表单设enctype=”multipart/form-data”,后端用request.files[‘file’]获取文件对象,并检查是否存在。…

    2025年12月14日
    000
  • Python中从自定义经验累积分布函数(CDF)抽样:直接与平滑插值方法

    本文详细阐述了如何从自定义的经验累积分布函数(cdf)中生成随机样本。我们将探讨两种主要方法:一是利用numpy的`interp`函数进行基于线性插值的直接抽样,该方法高效且易于实现;二是借助scipy的`interp1d`函数,通过选择不同的插值类型(如线性、三次样条等)实现更平滑的抽样。文章将通…

    2025年12月14日
    000
  • Python中处理文件移动时的Windows权限错误及fitz库的最佳实践

    本文深入探讨了在Windows环境下使用Python的`shutil.move`函数移动文件时常见的`PermissionError: [WinError 32]`问题,尤其是在与`fitz`等PDF处理库结合使用时。文章分析了文件锁定的根本原因,并指出在`with`语句中不当管理文件句柄可能导致的…

    2025年12月14日
    000
  • Tkinter中动态生成Entry和Checkbutton的全局重置与状态管理

    本文旨在提供一个关于tkinter中动态生成entry输入框和checkbutton复选框的全局重置解决方案。文章将详细阐述如何正确管理checkbutton的intvar变量,避免常见错误,并展示一个高效的reset_all函数,该函数能够清空所有动态创建的entry内容、重置其状态,并取消所有c…

    2025年12月14日
    000
  • Python 文件批量分类存储案例

    使用Python可自动按扩展名分类文件:通过os和shutil模块遍历“待整理文件”目录,根据预定义的file_categories映射关系,将.txt、.jpg等文件分别移入“文本文件”“图片文件”等子文件夹,未匹配的归入“其他文件”,实现高效批量整理。 在日常工作中,我们经常需要将大量文件按照特…

    2025年12月14日
    000
  • Matplotlib SVG 文件添加元数据注释:使用 metadata 参数

    Matplotlib 允许用户在保存 SVG 文件时嵌入元数据注释。本文将详细介绍如何利用 plt.savefig 函数的 metadata 参数,遵循 Dublin Core 标准,为 SVG 图形文件添加创建者(Creator)等信息,从而有效记录文件来源和上下文,提升文件可追溯性。 1. 为什…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信