当前位置: 首页 > article >正文

tp6 合成两个pdf文件(附加pdf或者替换pdf)

最近在做项目有个需求,项目中需要根据设置的html合同模板自动生成PDF合同供客户下载签署,并根据回传的已签署合同尾页来替换原来未签署合同的尾页,合成新的已签署合同文本。

读取两个PDF文件并合成的 具体代码记录如下:

use setasign\Fpdi\Fpdi;
use think\Image;

/*
 * 读取pdf文件 并合成pdf页面
 * $filename: 原始pdf文件
 * $type: 生成pdf的类型  I:直接预览PDF文件  F:PDF文件保存到本地  S:返回PDF文件流  D:直接下载PDF文件
 * $add_filePath: 附件文件路径  可为图片或者pdf页面
 * $add_type:add 添加新的pdf页面   edit 替换最后一页pdf文件
 * $newfilename: 生成的新文件名  如果不存在默认替换原始文件
 */
function readPDF($filename, $type='I', $add_filePath='', $add_type='add', $newfilename=''){
    // 加载现有的PDF文件
    $pdf = new FPDI();

    $pageCount = $pdf->setSourceFile($filename);

    //unlink($filename);//删除生成的初始pdf文件
    for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
        // 导入页面
        $templateId = $pdf->importPage($pageNo);
        $size = $pdf->getTemplatesize($templateId);
        $pdf->AddPage($size['orientation'], [$size['width'], $size['height']]);
        // 填充页面
        $pdf->useTemplate($templateId);

      //  $add_filePath = 'storage/business/seal/img/zhang.png';
        if($add_filePath){//需要合成图片 替换最后一页的pdf页面
            if ($pageNo == $pageCount && $add_type=='edit') {//210 297
                //替换最后一页PDF页面
//                $a = getimagesize($add_filePath);
                $pdf->Image($add_filePath, 0, 0, $size['width'], $size['height']); //
            }
        }

    }

    if( $add_type=='add'){//附加PDF文件
        if($add_filePath) {//需要合成图片 新加一个页面
            $pdf->AddPage();//新添加页面
            // 填充页面
            $pdf->Image($add_filePath, 0, 0, $size['width'], $size['height']); //
        }
    }

    if($newfilename){
        $filename = $newfilename;
    }

    // 保存PDF
    $pdfContent = $pdf->Output($filename, $type, true);//I:直接预览PDF文件、 D:直接下载PDF文件  F:PDF文件保存到本地  S:返回PDF文件流

    if ($type == 'S') {
        $pdfContent = base64_encode($pdfContent);

        return $pdfContent;
    }
    if($type == 'I'){
        exit;
    }

    return '';
}

配置:

1、加载包文件:

composer require setasign/fpdi


http://www.kler.cn/a/421578.html

相关文章:

  • Cannot resolve symbol ‘ActivityThread‘ | Android 语法
  • 经典C语言代码——part 19(链表)
  • Linux详解:文件权限
  • centos搭建keepalive
  • 一款支持80+语言,包括:拉丁文、中文、阿拉伯文、梵文等开源OCR库
  • 以AI算力助推转型升级,暴雨亮相CCF中国存储大会
  • 力扣hot100道【贪心算法后续解题方法心得】(三)
  • idea的version control
  • SpringBoot 监听Redis键过期事件 过期监听
  • 在macOS上从源码部署RAGFlow-0.14.1
  • centos新建磁盘
  • 网络安全 社会工程学 敏感信息搜集 密码心理学攻击 密码字典生成
  • 40分钟学 Go 语言高并发:内存管理与内存泄漏分析
  • 前端 vue3 + element-plus + ts 组件通讯,defineEmits,子传父示例
  • Neo4j APOC-01-图数据库 apoc 插件介绍
  • 使用OpenCV和卡尔曼滤波器进行实时活体检测
  • LearnOpenGL学习(光照 -- 颜色,基础光照,材质,光照贴图)
  • 底部导航栏新增功能按键
  • 类加载子系统
  • Java开发利器:IDEA的安装与使用(上)
  • 【音视频】HLS和DASH 流媒体协议的详细介绍和实现方式
  • C++知识整理day3类与对象(下)——赋值运算符重载、取地址重载、列表初始化、友元、匿名对象、static
  • git推送多个仓库
  • 十,[极客大挑战 2019]Secret File1
  • uniapp 自定义导航栏增加首页按钮,仿微信小程序操作胶囊
  • Flink 热存储维表 使用 Guava Cache 减轻访问压力