php数据导出pdf,然后pdf转图片,再推送钉钉群

public function takePdf($data_plan, $data_act, $file_name, $type){$pdf = new \TCPDF('L'); // L - 横向 P-竖向// 设置文档信息//$file_name = '外协批价单';$pdf->SetCreator($file_name);$pdf->SetAuthor($file_name);$pdf->SetTitle($file_name);$pdf->SetSubject($file_name);$pdf->SetKeywords('TCPDF, PDF, PHP');// 设置页眉和页脚信息// 设置页眉和页脚字体$pdf->setHeaderFont(['stsongstdlight', '', '9']);$pdf->setPrintHeader(false);$pdf->setPrintFooter(true);$pdf->setFooterFont(['stsongstdlight', '', '8']);// 设置默认等宽字体$pdf->SetDefaultMonospacedFont('courier');$pdf->setCellPaddings(10, 0, 10, 15);// 设置间距$pdf->SetMargins(12, 5, 10);//页面间隔$pdf->SetHeaderMargin(0);//页眉top间隔$pdf->SetFooterMargin(0);//页脚bottom间隔// 设置分页$pdf->SetAutoPageBreak(true, PDF_MARGIN_BOTTOM);// 设置默认字体构造子集模式$pdf->setFontSubsetting(true);//设置字体 stsongstdlight支持中文$pdf->SetFont('stsongstdlight', '', 10);ob_clean();$view      = \View::make("temp.shipping._explode_pdf", ["data_plan" => $data_plan, 'data_act' => $data_act, "file_name" => $file_name, "from" => $type]);$html      = $view->render();$html      = preg_replace("/\s\s+/", '', $html);$pdf->AddPage();$pdf->writeHTML($html, true, false, true, false, '');$pageW = $pdf->getPageWidth();// 添加图片水印$image_file = 'passed.png'; // 图片路径//$pdf->Image($image_file, $pageW-35, 0, 35, 35, 'PNG', '', 'T', false, 300);// 参数解释:图片路径,x坐标,y坐标,宽度,高度,图片类型,链接,对齐方式,是否重新取样,dpi,角度,是否为模板使用,是否使用mask,角度,是否显示边框,是否在背景图像上显示文本,是否在文本上显示背景图像ob_clean();//输出PDF$path = public_path('uploads/');$file_path = $path . 'shipping/' . date("Y-m-d")."/";if (!is_dir($file_path)) {mkdir($file_path, 0777, true);}$fileName = 'sp_'.date("YmdHis") . time();$file_path .= $fileName.".pdf";$pdf->Output($file_path, 'F');//I输出、D下载return ['fileName'=>$fileName,'filePath'=>$file_path];}/*** 将pdf文件转化为多张png图片*/public function embroideryCheckToPng($pdfRes){$imagick = new \Imagick();// 设置 PDF 分辨率,值越大图片越清晰,但处理时间和内存占用也会增加$imagick->setResolution(300, 300);// 读取 PDF 文件//$filePath = './uploads/shipping/2025-05-12/sp_202505121347381747028858.pdf';$imagick->readImage($pdfRes['filePath']);// 遍历 PDF 的每一页并转换为图片foreach ($imagick as $key => $page) {// 设置图片格式为 JPEG$page->setImageFormat('jpeg');$page->setBackgroundColor("green");$page->setImageAlphaChannel(\Imagick::ALPHACHANNEL_REMOVE);// 设置图片质量,范围从 0 到 100,值越大质量越高$page->setImageCompressionQuality(80);// 保存图片if (!is_dir($_SERVER['DOCUMENT_ROOT'] . '/uploads/shipping/image/' . date("Y-m-d"))) {mkdir($_SERVER['DOCUMENT_ROOT'] . '/uploads/shipping/image/' . date("Y-m-d"), 0777, true);}$fileName = 'uploads/shipping/image/' . date("Y-m-d") . '/'.$pdfRes['fileName']. '.jpg';$page->writeImage($_SERVER['DOCUMENT_ROOT'].$fileName);}// 销毁 Imagick 对象,释放资源$imagick->destroy();return $_SERVER['DOCUMENT_ROOT'].$fileName ?? null;}/*** 推群*/public function pushDingChat($image_path,$chatid){$ding = new Dingd();$dingRes = $ding->media_curl($image_path);$send_data = ['chatid'   => $chatid,"msg" => ['msgtype' => 'image','image' => ["media_id" => $dingRes['media_id'],],]];\Illuminate\Support\Facades\Log::channel('shipping')->info("【出货管理-出货群】" . jsonEncode($send_data));$res = $ding->send_msg($send_data);\Illuminate\Support\Facades\Log::channel('shipping')->info("【出货管理-出货群】".  jsonEncode($res));return $res;}

pdf文件:

<style>.table th,.table td{padding: 5px}/*table td{ height:30px; border: 1px solid;color: black}*/.tdcen /*设置表格文字左右和上下居中对齐*/{text-align: center;vertical-align: middle !important;}.head_th{background-color: #addcff;color: black;font-size: 13px;text-align: center;}.head_th_act{background-color: #d4ffe0;color: black;font-size: 13px;text-align: center;}.head_th_td{color: black;font-size: 12px;text-align: center;height: 25px;line-height: 35px;border-bottom: 1px dashed #ccc;}
</style>
<template><table cellpadding="1"  style=""><thead></thead><tbody><tr><td colspan="9" style="font-size: 25px;color: #796f53;font-weight: bold;text-align: center;"><div>{{ $file_name }}</div></td></tr></tbody></table>{{--出货计划提交--}}<table class="table table-bordered" cellpadding="2"  style="border:1px solid #ccc;margin-top: 20px;"><thead></thead><tbody><tr style="padding:1rem;"><td class="head_th">序号</td><td class="head_th">客户</td><td class="head_th">装车日期</td><td class="head_th">运输方式</td><td class="head_th">箱数</td><td class="head_th">体积</td><td class="head_th">目的仓库</td><td class="head_th">运输公司</td><td class="head_th">备注</td></tr>@foreach($data_plan['list'] as $key => $v)<tr><td class="head_th_td">{{$key+1}}</td><td class="head_th_td">{{$v['client_name']}}</td><td class="head_th_td">{{$v['shipping_date']}}</td><td class="head_th_td">{{$v['transportation_name']}}</td><td class="head_th_td">{{$v['packs']}}</td><td class="head_th_td">{{$v['volume']}}</td><td class="head_th_td">{{$v['destination_git']}}</td><td class="head_th_td">{{$v['transport_name']}}</td><td class="head_th_td">{{$v['remark']}}</td></tr>@endforeach</tbody></table><table cellpadding="1"  style="border: 1px solid #ccc;"><tbody><tr><td style="font-size: 12px;background-color: #addcff;color: black;height: 30px;text-align: center;vertical-align: middle;line-height: 40px;letter-spacing:2px;" colspan="4">合计</td><td style="font-size: 12px;background-color: #addcff;color: black;height: 30px;text-align: center;vertical-align: middle;line-height: 40px;letter-spacing:2px;">{{$data_plan['total_packs']}}</td><td style="font-size: 12px;background-color: #addcff;color: black;height: 30px;text-align: center;vertical-align: middle;line-height: 40px;letter-spacing:2px;">{{$data_plan['total_volume']}}</td></tr></tbody></table>{{--实际出货提交--}}@if(isset($from) && $from == 2)<table class="table table-bordered" cellpadding="2"  style="border:1px solid #ccc;margin-top: 20px;"><thead></thead><tbody><tr style="padding:1rem;"><td class="head_th_act">序号</td><td class="head_th_act">客户</td><td class="head_th_act">装车日期</td><td class="head_th_act">具体时间</td><td class="head_th_act">箱数</td><td class="head_th_act">体积</td><td class="head_th_act">车牌</td><td class="head_th_act">目的仓库</td><td class="head_th_act">运输公司</td><td class="head_th_act">备注</td></tr>@foreach($data_act['list'] as $key => $v)<tr><td class="head_th_td">{{$key+1}}</td><td class="head_th_td">{{$v['client_name']}}</td><td class="head_th_td">{{$v['shipping_date']}}</td><td class="head_th_td">{{$v['shipping_date_time']}}</td><td class="head_th_td">{{$v['packs']}}</td><td class="head_th_td">{{$v['volume']}}</td><td class="head_th_td">{{$v['license_plate_num']}}</td><td class="head_th_td">{{$v['destination_git']}}</td><td class="head_th_td">{{$v['transport_name']}}</td><td class="head_th_td">{{$v['remark']}}</td></tr>@endforeach</tbody></table><table cellpadding="1"  style="border: 1px solid #ccc;"><tbody><tr><td style="font-size: 12px;background-color: #d4ffe0;color: black;height: 30px;text-align: center;vertical-align: middle;line-height: 40px;letter-spacing:2px;" colspan="4">已出货合计</td><td style="font-size: 12px;background-color: #d4ffe0;color: black;height: 30px;text-align: center;vertical-align: middle;line-height: 40px;letter-spacing:2px;">{{$data_act['total_packs']}}</td><td style="font-size: 12px;background-color: #d4ffe0;color: black;height: 30px;text-align: center;vertical-align: middle;line-height: 40px;letter-spacing:2px;">{{$data_act['total_volume']}}</td></tr><tr><td style="font-size: 12px;background-color: #fff0e2;color: #ff5473;height: 30px;text-align: center;vertical-align: middle;line-height: 40px;letter-spacing:2px;" colspan="4">未出货合计</td><td style="font-size: 12px;background-color: #fff0e2;color: #ff5473;height: 30px;text-align: center;vertical-align: middle;line-height: 40px;letter-spacing:2px;">{{$data_act['diff_packs']}}</td><td style="font-size: 12px;background-color: #fff0e2;color: #ff5473;height: 30px;text-align: center;vertical-align: middle;line-height: 40px;letter-spacing:2px;">{{$data_act['diff_volume']}}</td></tr></tbody></table>@endif
</template>

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

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

相关文章

每日算法-250513

每日算法 - 2024-05-13 记录今天学习的算法题解。 2335. 装满杯子需要的最短总时长 题目 思路 贪心 这道题的关键在于每次操作尽可能多地减少杯子的数量。我们每次操作可以装一杯或两杯&#xff08;不同类型&#xff09;。为了最小化总时间&#xff0c;应该优先选择装两杯不同…

城市生命线综合管控系统解决方案-守护城市生命线安全

一、政策背景 国务院办公厅《城市安全风险综合监测预警平台建设指南》‌要求&#xff1a;将燃气、供水、排水、桥梁、热力、综合管廊等纳入城市生命线监测体系&#xff0c;建立"能监测、会预警、快处置"的智慧化防控机制。住建部‌《"十四五"全国城市基础…

分布式AI推理的成功之道

随着AI模型逐渐成为企业运营的核心支柱&#xff0c;实时推理已成为推动这一转型的关键引擎。市场对即时、可决策的AI洞察需求激增&#xff0c;而AI代理——正迅速成为推理技术的前沿——即将迎来爆发式普及。德勤预测&#xff0c;到2027年&#xff0c;超半数采用生成式AI的企业…

auto.js面试题及答案

以下是常见的 Auto.js 面试题及参考答案&#xff0c;涵盖基础知识、脚本编写、运行机制、权限、安全等方面&#xff0c;适合开发岗位的技术面试准备&#xff1a; 一、基础类问题 什么是 Auto.js&#xff1f;它的主要用途是什么&#xff1f; 答案&#xff1a; Auto.js 是一个…

C语言中的指定初始化器

什么是指定初始化器? C99标准引入了一种更灵活、直观的初始化语法——指定初始化器(designated initializer), 可以在初始化列表中直接引用结构体或联合体成员名称的语法。通过这种方式,我们可以跳过某些不需要初始化的成员,并且可以以任意顺序对特定成员进行初始化。这…

高德地图在Vue3中的使用方法

1.地图初始化 容器创建&#xff1a;通过 <div> 标签定义地图挂载点。 <div id"container" style"height: 300px; width: 100%; margin-top: 10px;"></div> 密钥配置&#xff1a;绑定高德地图安全密钥&#xff0c;确保 API 合法调用。 参…

RabbitMQ发布订阅模式深度解析与实践指南

目录 RabbitMQ发布订阅模式深度解析与实践指南1. 发布订阅模式核心原理1.1 消息分发模型1.2 核心组件对比 2. 交换机类型详解2.1 交换机类型矩阵2.2 消息生命周期 3. 案例分析与实现案例1&#xff1a;基础广播消息系统案例2&#xff1a;分级日志处理系统案例3&#xff1a;分布式…

中小型培训机构都用什么教务管理系统?

在教育培训行业快速发展的今天&#xff0c;中小型培训机构面临着学员管理复杂、课程体系多样化、教学效果难以量化等挑战。一个高效的教务管理系统已成为机构运营的核心支撑。本文将深入分析当前市场上适用于中小型培训机构的教务管理系统&#xff0c;重点介绍爱耕云这一专业解…

C++虚函数食用笔记

虚函数定义与作用&#xff1a; virtual关键字声明虚函数&#xff0c;虚函数可被派生类override(保证返回类型与参数列表&#xff0c;名字均相同&#xff09;&#xff0c;从而通过基类指针调用时&#xff0c;实现多态的功能 virtual关键字: 将函数声明为虚函数 override关键…

运算放大器相关的电路

1运算放大器介绍 解释&#xff1a;运算放大器本质就是一个放大倍数很大的元件&#xff0c;就如上图公式所示 Vp和Vn相差很小但是放大后输出还是会很大。 运算放大器不止上面的三个引脚&#xff0c;他需要独立供电&#xff1b; 如图比较器&#xff1a; 解释&#xff1a;Vp&…

华为OD机试真题——通信系统策略调度(用户调度问题)(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

Ubuntu 系统默认已安装 python,此处只需添加一个超链接即可

步骤 1&#xff1a;确认 Python 3 的安装路径 查看当前 Python 3 的路径&#xff1a; which python3 输出类似&#xff1a; /usr/bin/python3 步骤 2&#xff1a;创建符号链接 使用 ln -s 创建符号链接&#xff0c;将 python 指向 python3&#xff1a; sudo ln -s /usr/b…

深度学习-分布式训练机制

1、分布式训练时&#xff0c;包括train.py的全部的代码都会在每个gpu上运行吗&#xff1f; 在分布式训练&#xff08;如使用 PyTorch 的 DistributedDataParallel&#xff0c;DDP&#xff09;时&#xff0c;每个 GPU 上运行的进程会执行 train.py 的全部代码&#xff0c;但通过…

yarn的介绍

### Yarn 的基本概念 Yarn 是 Hadoop 生态系统中的一个重要组成部分&#xff0c;它是一种分布式资源管理框架&#xff0c;旨在为大规模数据处理提供高效的资源管理和调度能力。以下是关于 Yarn 的一些核心概念&#xff1a; #### 1. **Yarn 的定义** Yarn 是一个资源调度平台&a…

Spring-messaging-MessageHandler接口实现类ServiceActivatingHandler

ServiceActivatingHandler实现了MessageHandler接口&#xff0c;所以它是一个MessageHandler&#xff0c;在spring-integration中&#xff0c;它也叫做服务激活器&#xff08;Service Activitor&#xff09;&#xff0c;因为这个类是依赖spring容器BeanFactory的&#xff0c;所…

快速入门深度学习系列(2)----损失函数、逻辑回归、向量化

针对深度学习入门新手目标不明确 知识体系杂乱的问题 拟开启快速入门深度学习系列文章的创作 旨在帮助大家快速的入门深度学习 写在前面&#xff1a; 本系列按照吴恩达系列课程顺序发布(说明一下为什么不直接看原笔记 因为内容太多 没有大量时间去阅读 所有作者需要一次梳理…

KingBase问题篇

安装环境 操作系统&#xff1a;CentOS7 CPU&#xff1a;X86_64架构 数据库&#xff1a;KingbaseES_V008R006C009B0014_Lin64_install.iso 项目中遇到的问题 Q1. 执行sql中有字符串常量&#xff0c;且用双引号包裹&#xff0c;执行报错 A1. 默认KingBase不认双引号&#xff0…

濒危仙草的重生叙事:九仙尊米斛花节如何以雅集重构中医药文化IP

五月的霍山深处,层峦叠翠之间,中华仙草霍山米斛迎来一年一度的花期。九仙尊以“斛韵雅集,春野茶会”为主题,举办为期半月的米斛花文化节,融合中医药文化、东方美学与自然体验,打造一场跨越古今的沉浸式文化盛宴。活动涵盖古琴雅集、书法创作、茶道冥想、诗歌吟诵、民族歌舞等多…

LeetCode100.1 两数之和

今天晚上看了许多关于未来计算机就业的视频&#xff0c;有种正被贩卖焦虑的感觉&#xff0c;翻来覆去下决定先做一遍leetcode100给自己降降温&#xff0c;打算每周做四题&#xff0c;尽量尝试不同的方法与不同的语言。 一开始想到的是暴力解法&#xff0c;两层循环。数据量为1e…

python制造一个报错

以下是用Python制造常见错误的示例及解析&#xff0c;涵盖不同错误类型&#xff0c;便于理解调试原理&#xff1a; 一、语法错误 (SyntaxError) # 错误1&#xff1a;缺少冒号 if Trueprint("这行不会执行")# 错误2&#xff1a;缩进错误 def func(): print("未对…