【第三方库】PHP实现创建PDF文件和编辑PDF文件
目录
引入Setasign/fpdf、Setasign/fpdi
解决写入中文时乱码问题
1.下载并放置中文语言包(他人封装):https://github.com/DCgithub21/cd_FPDF
2.编写并运行生成字体文件的程序文件(addFont.php)
中文字体举例(其他字体同样操作)
3.修改部分文件内容
实现功能-创建PDF文件
实现功能-编辑PDF文件
感谢阅读,欢迎讨论(本文仅记录项目集成的功能)
引入Setasign/fpdf、Setasign/fpdi
composer require Setasign/fpdf ^1.8
composer require Setasign/fpdi ^2.3
fpdi官网:FPDI free PDF document importer ▷ setasign.com
fpdf官网:FPDF
fpdf中文使用手册

解决写入中文时乱码问题
1.下载并放置中文语言包(他人封装):https://github.com/DCgithub21/cd_FPDF
ttf2pt1.zip:字体转换工具程序
解压文件夹并修改名称:fpdf_chinese;
将文件夹放置到vendor/setasign目录下,与setasign/fpdf、setasign/fpdi同等级 ;
2.编写并运行生成字体文件的程序文件(addFont.php)
<?php
// 引入fPdf中文语言包
require '../vendor/setasign/fpdf/makefont/makefont.php';
// 设置中文字体文件的路径
$fontFilePath = './simhei.ttf';
// 执行方法,转换字体文件
MakeFont($fontFilePath);
# 执行脚本文件
php addFont.php simhei.ttf

中文字体举例(其他字体同样操作)
引入中文字体:微软雅黑、下载中文字体:微软雅黑
下载地址:http://m.diyiziti.com/Download/537/
3.修改部分文件内容
vendor/setasign/fpdi/src/FpdfTpl.php

vendor/setasign/fpdf_chinese/chinese.php

vendor/setasign/fpdf_chinese/fpdf.php

实现功能-创建PDF文件
class Setasign extends Pdf
{/* todo 边框的参数值 */const Border = 1; // todo 设置边框const NoBorder = 0; // todo 设置无边框const BorderL = 'L'; // todo 设置左边边框const BorderR = 'R'; // todo 设置右边边框const BorderT = 'T'; // todo 设置顶部边框const BorderB = 'B'; // todo 设置底部边框/* todo 文字的对齐方向 */const AlignJ = 'J'; // todo 自动调整const AlignL = 'L'; // todo 左边对齐const AlignC = 'C'; // todo 居中对齐const AlignR = 'R'; // todo 右边对齐/* todo 内容的换行方向 */const LnRight = 0; // todo 向右移动const LnNextStart = 1; // todo 向下一行开始const LnDown = 2; // todo 向下面移动/* todo 背景是否填满 */const FillBgTransparent = 0; // todo 透明背景const FillBg = 1; // todo 填满背景/* 创建pdf文件 */public static function createPdf(){// 引入中文的fpdf库require root_path('vendor\\setasign\\fpdf_chinese') . 'chinese.php';$pdf = new \PDF_Chinese();$pdf->SetAutoPageBreak(true);$pdf->AddPage();$pdf->AddGBFont('simhei',iconv("UTF-8","gbk",'黑体'));$pdf->SetFont('simhei');$width = $pdf->GetPageWidth(); // 页面的宽度$height = $pdf->GetPageHeight(); // 页面的高度$pdf->SetTitle(iconv("UTF-8", "gbk", "test-pdf"));$str = "自动换行,自动换行,自动换行,自动换行,自动换行,自动换行自动换行,自动换行,自动换行,自动换行,自动换行,自动换行";$pdf->MultiCell($width - 20, 8, iconv("utf-8", "gbk", $str));for ($i = 1;$i < 100;$i++) {$str = "这是第{$i}行的文字";$pdf->MultiCell($width - 20, 8, iconv("utf-8", "gbk", $str), null, Setasign::AlignC);}$pdf->Output(root_path('app\\controller').'/result.pdf',"F");}
}
实现功能-编辑PDF文件
<?php
namespace Pdf;use setasign\Fpdi\Fpdi;
class Setasign extends Pdf
{/* todo 边框的参数值 */const Border = 1; // todo 设置边框const NoBorder = 0; // todo 设置无边框const BorderL = 'L'; // todo 设置左边边框const BorderR = 'R'; // todo 设置右边边框const BorderT = 'T'; // todo 设置顶部边框const BorderB = 'B'; // todo 设置底部边框/* todo 文字的对齐方向 */const AlignJ = 'J'; // todo 自动调整const AlignL = 'L'; // todo 左边对齐const AlignC = 'C'; // todo 居中对齐const AlignR = 'R'; // todo 右边对齐/* todo 内容的换行方向 */const LnRight = 0; // todo 向右移动const LnNextStart = 1; // todo 向下一行开始const LnDown = 2; // todo 向下面移动/* todo 背景是否填满 */const FillBgTransparent = 0; // todo 透明背景const FillBg = 1; // todo 填满背景public static function editPdf(){$pdf = new Fpdi();// 获取pdf的页数$pageCount = $pdf->setSourceFile(root_path('app\\controller').'/result.pdf');// 设置全局字体、字体大小、字体颜色、每一个都需要单独字体则再设置覆盖$pdf->AddGBFont('mryh', iconv("utf-8", "gbk", "微软雅黑"));$pdf->SetFont("mryh", '', 20);$pdf->SetTextColor(0,0,0);$width = $pdf->GetPageWidth(); // 页面的宽度// 加载第一页$pdf->AddPage();$tpl = $pdf->importPage(1);$pdf->useTemplate($tpl, 0, 0);$pdf->SetXY(10, 170);$str = "第一页设置的内容";$pdf->MultiCell($width - 20, 8,iconv("utf-8", "gbk", $str),null, Setasign::AlignC);// 加载第二页$pdf->AddPage();$tpl = $pdf->importPage(2);$pdf->useTemplate($tpl, 0, 0, null, null, true);$str = "第二页设置的内容";$pdf->SetXY(40, 170);$pdf->Write(10, iconv("utf-8", "gbk", $str));// 输出文件$pdf->Output(root_path('app\\controller').'/result1.pdf',"F");}
}
感谢阅读,欢迎讨论(本文仅记录项目集成的功能)
相关文章:
【第三方库】PHP实现创建PDF文件和编辑PDF文件
目录 引入Setasign/fpdf、Setasign/fpdi 解决写入中文时乱码问题 1.下载并放置中文语言包(他人封装):https://github.com/DCgithub21/cd_FPDF 2.编写并运行生成字体文件的程序文件(addFont.php) 中文字体举例&…...
线程的回收及内存演示
ps -elf|grep mthread 查看进程和线程 top -p 6513 查看内存 一、线程的回收 使用pthread_join 函数: #include <pthread.h> int pthread_join(pthread_t thread, void **retval); 注意:pthread_join 是阻塞函数,如果回收的线…...
高精度倾角传感器测量原理
高精度倾角传感器测量原理技术参数 1.性能参数 测量范围:0~30 测量精度:0.06 分 辨 率:0.0001 测量方向:X,Y 时间漂移:0.08/月 更新时间:30ms 上电启动时间:0.5s 2.电…...
Android 12 init流程分析
前言 刚开始接触需要了解的概念理解过程遇到了什么问题代码的位置和流程分析如何分析和调试遇到的问题 基本的概念 .rc 文件 这个文件在Android framework 中服务相关代码可以看到。类似surfaceflinger.rc 、mediaserver.rc等等。 在这些rc里面定义了某一个service࿰…...
【Python小技巧】Python操控Chrome浏览器实现网页打开、切换、关闭(送独家Chrome操作打包类源码、Chrome浏览器Cookie在哪里?)
文章目录 前言一、什么时候需要用Python控制浏览器?二、下载Chrome浏览器驱动文件1. 安装Chrome浏览器并查看版本2. 下载浏览器驱动文件3. 解压到python编译器目录(python.exe所在目录) 三、Python控制Chrome浏览器(附源代码&…...
数据在内存中的存储
目录 一、数据类型的介绍 1.C语言基本内置类型 2.类型基本归类 1.整形 2.浮点型 3.构造类型 4.指针类型 二、整形在内存中的存储 三、浮点数在内次中的存储 1.存储形式 2.对M、E的特殊规定 (1)对M的特殊规定 (2)对E的…...
Rust in Action笔记 第三章 复合数据类型
通过#[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZI50wIh1-1685693144796)(null)]),不带感叹号的#[allow]仅为下一行代码提供属性,属性有多种分类,文中出现的allow属性称为诊断属性(Diag…...
算法基础学习笔记——⑬高斯消元\组合计数\容斥原理
✨博主:命运之光 ✨专栏:算法基础学习 目录 ✨高斯消元 ✨组合计数 🍓通过预处理逆元的方式求组合数: 🍓Lucas定理: 🍓分解质因数法求组合数: 前言:算法学习笔记记录日常分享,需…...
渗透测试辅助工具箱
0x01 说明 渗透测试辅助工具箱 运行条件:jdk8 双击即可运行 反弹shell,命令生成器,自动编码,输入对应IP端口即可,实现一劳永逸,集成一些小工具,辅助渗透,提高效率 输入框说明 L…...
chatgpt赋能python:Python后退命令:如何让你的程序退回到之前的状态
Python后退命令:如何让你的程序退回到之前的状态 Python是一种高级编程语言,因其易读易懂而闻名于世。Python中有很多命令用于编写程序,其中一项重要的命令是后退命令。本文将介绍Python后退命令的使用方法,并为您提供详细的步骤…...
OJ练习第127题——统计范围内的元音字符串数
统计范围内的元音字符串数 力扣链接:2559. 统计范围内的元音字符串数 题目描述 给你一个下标从 0 开始的字符串数组 words 以及一个二维整数数组 queries 。 每个查询 queries[i] [li, ri] 会要求我们统计在 words 中下标在 li 到 ri 范围内(包含 这…...
图片优化: CssSprites与Base64编码
文章目录 1 css sprites1.1 CSS Sprites是什么1.2 为什么需要css sprites1.3 优势1.4 使用原理1.5 DEMO 2 图片Base64编码 1 css sprites 1.1 CSS Sprites是什么 CSS Sprites是一种网页图片应用处理方式。 又被解释为: CSS精灵CSS图像拼合CSS贴图定位CSS图片精灵…...
JavaScript中的Map、WeakMap和Object的区别
Map Map是一种新的数据结构,它允许使用任何数据类型(包括对象和基本数据类型)作为键。 Map的一些特性包括: 保持键的插入顺序:当遍历Map时,键值对会按照插入顺序返回。键可以是任意类型:与Obj…...
华为OD机试之打印机队列(Java源码)
打印机队列 题目描述 有5台打印机打印文件,每台打印机有自己的待打印队列。 因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的代先级,其中 数字越大优先级越高 打印机会从自己的待打印队列中选择优先级最高的文件来打印。 如…...
分享一个国内免费的ChatGPT网站,手机电脑通用,免费无限制,支持AI绘画
背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具,近期的热度直接沸腾🌋。 作为一个AI爱好者,翻遍了各大基于ChatGPT的网站,终于找到一个免费!免登陆!手机电脑通用!国内可直接对话的C…...
【面向对象编程1】——类和对象——如桃花来
目录索引 面向过程和面向对象的区别:面向过程:面向对象:总结: 类和对象:定义类:语法: 创建对象:实例演示: 魔法方法:__init __方法:__ del __方法…...
chat聊天系统消息消费时遇到的问题及优化思路(二)
1、前言 考虑下面几个条件下如何提升kafka的消费速度 消息要求严格有序,如chat聊天消息业务处理速度慢,如处理一条数据需要100ms分片不合理,如有的分区很闲,有的分区消息数量积压 2、解决方案 1、顺序问题 关于消息消费时存在…...
js正则中的match()
在前端开发中,正则表达式是一大利器。所以我们这次就来讨论下match()方法。 match本身是JavaScript语言中字符串对象的一个方法,该方法的签名是 match([string] | [RegExp]) 它的参数既可以是一个字符串,也可以是一个正则表达式。该方法绝…...
Apache 配置和应用
目录 构建虚拟 Web 主机 Options指令解释 Options指令常用选项 AllowOverride指令解释: 地址限制策略: httpd服务支持的虚拟主机类型包括以下三种: 基于域名的虚拟主机 1.为虚拟主机提供域名解析 2.为虚拟主机准备网页文档 3.添加虚拟…...
实现PyTorch/ONNX自定义节点操作的TensorRT部署
参考一 下面是基本步骤: 加载训练好的bev transformer网络权重参数: import torch from model import Modelmodel Model() model.load_state_dict(torch.load("path/to/weights"))定义新的自定义操作: import torch from torc…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
