【第三方库】PHP实现创建PDF文件和编辑PDF文件

news2024/10/5 21:25:22

目录

引入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");
    }
}

感谢阅读,欢迎讨论(本文仅记录项目集成的功能)

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

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

相关文章

【数据结构】第七周

稀疏矩阵快速转置 【问题描述】 稀疏矩阵的存储不宜用二维数组存储每个元素&#xff0c;那样的话会浪费很多的存储空间。所以可以使用一个一维数组存储其中的非零元素。这个一维数组的元素类型是一个三元组&#xff0c;由非零元素在该稀疏矩阵中的位置&#xff08;行号…

xxl-job的部署及springboot集成使用

介绍 XXL-Job是一个分布式任务调度平台&#xff0c;可进行任务调度、管理和监控&#xff0c;并提供任务分片、失败重试、动态分配等功能。它是一个开源项目&#xff0c;基于Spring Boot和Quartz开发&#xff0c;支持常见的任务调度场景。 XXL-Job的使用相对简单&#xff0c;只…

自学网络安全最细规划(建议收藏)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

微信小程序后台:解决微信扫普通链接地址无法跳转到体验版微信的问题,配置普通链接二维码规则解释和理解

微信小程序后台&#xff1a;解决微信扫普通链接地址无法跳转到体验版微信的问题&#xff0c;配置普通链接二维码规则解释和理解 一、现象与原因 最近突然发现微信管理平台中&#xff0c;设置好的普通二维码连接跳转到体验版小程序的功能&#xff0c;没有区分体验版和生产版&a…

条件变量基本使用

一、条件变量 应用场景&#xff1a;生产者消费者问题&#xff0c;是线程同步的一种手段。 必要性&#xff1a;为了实现等待某个资源&#xff0c;让线程休眠。提高运行效率 int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex); int pthr…

手把手教你做独立t检验

一、案例介绍 为研究国产四类新药阿卡波糖胶囊的降血糖效果&#xff0c;某医院用40名2型糖尿病患者进行同期随机对照试验。研究者将这些患者随机等分到试验组&#xff08;用阿卡波糖胶囊&#xff09;和对照组&#xff08;用拜唐苹胶囊&#xff09;&#xff0c;分别测得试验开始…

如何使用宝塔面板搭建网站(Linux服务器配置篇)

搭建网站我们需要&#xff1a; 必须是Linux服务器&#xff08;最低要求配置1核1G当然再低些也能运行但是不建议&#xff09;自己的域名&#xff08;可以去阿里云或者腾讯云了解&#xff09;PHP项目 此处展示的是华为云服务器&#xff08;各个服务器的购买和使用差别不大&#…

“以API接口快速获得aliexpress速卖通商品详情-返回值说明

为了方便商家获取速卖通上的商品信息&#xff0c;速卖通提供了API接口来获取商品数据。本文将介绍如何通过API接口获取速卖通商品数据。 一、申请API接口权限 在使用API接口前&#xff0c;首先需要在速卖通官网注册账号并通过实名认证。然后&#xff0c;在个人资料页面找到开…

Java 的多线程浅析

前言 Java 的多线程在当今业界已经成为了一个非常重要的技能。无论您是新手还是经验丰富的程序员&#xff0c;精通 Java 的多线程编程都是至关重要的。因为多线程可以帮助您实现更快的应用程序、更高效的性能以及更出色的用户体验。在这篇文章中&#xff0c;我们将介绍有关 Ja…

【资料分享】PLC中输入输出端子

PLC输入输出分为高速和低速&#xff0c;一般来说不会超出&#xff0c;隔离器MOS的设计。其中具体采用光耦隔离还是数字隔离器隔离&#xff0c;其隔离器件会限制其输入输出的速率&#xff1b;PLC的源型和漏型就取决于最后末端所接的MOS管是如何布置的。 MOS管的源极和漏极 MOS…

Java 注解配合Spring AOP 导入Excel文件

Java 注解配合Spring AOP 导入Excel文件 这个就是把上一篇&#xff0c;封装了一层&#xff1b;根据注解中配置的变量名和方法名&#xff0c;通过JoinPoint获取到对应的对象和方法 注解 import static java.lang.annotation.ElementType.METHOD; import static java.lang.ann…

02 Redis经典五种数据类型介绍及落地运用

命令大全9大类型 String(字符类型)Hash(散列类型)List(列表类型)Set(集合类型)SortedSet(有序集合类型&#xff0c;简称zset)Bitmap(位图)HyperLogLog(统计)GEO(地理)Stream&#xff08;了解&#xff09; string 常用命令 最常用 set key valueget key 同时设置/获取多个键…

Spring之状态机讲解

文章目录 1 状态机1.1 什么是状态1.2 四大概念1.3 状态机1.4 spring statemachine 2 示例Demo2.1 订单状态图2.2 建表2.3 依赖和配置2.3.1 pom.xml2.3.2 application.yml 2.4 状态机配置2.4.1 定义状态机状态和事件2.4.2 定义状态机规则2.4.3 配置持久化2.4.3.1 持久化到内存2.…

畅游星河的炫彩手柄,配置也不简单,北通阿修罗2Pro上手

平时在PC上玩个游戏&#xff0c;还是手柄更好用。在国产的手柄里面&#xff0c;北通的很多人都用&#xff0c;选择比较多&#xff0c;价格相对也更加亲民一些&#xff0c;之前看到北通阿修罗2Pro新出了一款无线星河版本&#xff0c;做得很好看&#xff0c;上周到手后试了试&…

元宇宙,开启下一个消费Z时代

元宇宙到底怎么了&#xff1f;为什么国外一片唱衰&#xff0c;而国内却依旧不遗余力的积极推动&#xff1f;接下来&#xff0c;国内元宇宙又将带来怎样的机遇&#xff1f; 此时此刻&#xff0c;元宇宙被一味吹捧的阶段已经过去&#xff0c;取而代之的是并存的唱衰声与叫好声&a…

《Opencv3编程入门》学习笔记—第三章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第三章 HighGUI图形用户界面初步 一、图像的载入、显示和输出到文件 &#xff08;一&#xff09;OpenCV的命名空间 简单的OpenCV程序标配&#xff1a; #include <o…

如何利用Citespace和vosviewer既快又好地写出高质量的论文及快速锁定热点和重点文献进行可视化分析

文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研究…

Oracle实现主键字段自增

Oracle实现主键自增有4种方式&#xff1a; Identity Columns新特性自增&#xff08;Oracle版本≥12c&#xff09; 创建自增序列&#xff0c;创建表时&#xff0c;给主键字段默认使用自增序列 创建自增序列&#xff0c;使用触发器使主键自增 创建自增序列&#xff0c;插入语句&…

都2023年了,你竟然还不知道网络安全该怎么学!

前言 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然或恶意原因而遭受破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 网络安全因何而重要&#xff1f; 截至2022年6月,我国网民规模为10.51亿&#xff0c…

nodejs 中使用websocket 并且区分空间,实现收到客服端消息 同步给房间内所有连接,小程序中使用websocket,区分房间、空间

❤️砥砺前行&#xff0c;不负余光&#xff0c;永远在路上❤️ 目录 前言一、服务端1、主要是通过nodeexpresswebsocket搭建2、代码大概结构3、nodejs 启动入口文件 引入自己的websocket文件&#xff0c;这里是为了和 http 服务结合起来&#xff0c;将server传入4、websocket.j…