【第三方库】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…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...
