php中使用Fpdf、Fpdi类库合并PDF文件或者合并PNG图片生成新的PDF文件

前言

最近遇到了需要把多个PDF文件合并成一个PDF文件、把PNG格式的图片合并生成一个新的PDF文件的需求。
解决办法是采用Fpdi类库来实现。
 * composer命令安装:composer require setasign/fpdf
 * composer命令安装:composer require setasign/fpdi
<?php
//档案管理中的公用方法
//引入加载PDF合成多个PDF的扩展
vendor('setasign.fpdi.autoload');
use setasign\Fpdi\Fpdi;

/**
 * 拼接多个PDF
 * @param [type] $pdf_road_datas 需要合并的PDF文件的绝对路径地址一维数组,['F:\02.01.12.pdf','F:\18.44.01.pdf']
 * @param [type] $local_path 合成以后生成的PDF文件到指定的路径+文件名,"F:\merge.pdf"
 * @return void
 */
function selectionSplicingToNewPdf($pdf_road_datas, $local_path)
{
    //实例化模型类
    $pdf = new Fpdi();
    //合并PDF
    for ($i = 0; $i < count($pdf_road_datas); $i++) {
        $page_count = $pdf->setSourceFile($pdf_road_datas[$i]);
        for ($pageNo = 1; $pageNo <= $page_count; $pageNo++) {
            //一页一页的读取PDF,添加到新的PDF
            $templateId = $pdf->importPage($pageNo);
            $size = $pdf->getTemplateSize($templateId);
            $pdf->AddPage($size['orientation'], $size);
            $pdf->useTemplate($templateId);
            $pdf->SetFont('Helvetica');
            $pdf->SetXY(5, 5);
        }
    }
    //方法F,保存合并以后的PDF文件到指定的目录
    $pdf->output("F", $local_path);
}

/**
 * 先转换PDF为PNG图片,然后合并成PDF文件
 * @param [type] $pdf_road_datas 需要合并的PDF文件的绝对路径地址一维数组,['F:\02.01.12.pdf','F:\18.44.01.pdf']
 * @param [type] $png_path 生成图片的地址 "F:/"
 * @param [type] $local_path 合成以后生成的PDF文件到指定的路径+文件名,"F:\merge.pdf"
 * @return void
 */
function selectionPngToNewPdf($pdf_road_datas, $png_path, $local_path)
{
    //实例化模型类
    $pdf = new Fpdi();
    foreach ($pdf_road_datas as $row) {
        $pages = getPageTotal($row);
        foreach (range(0, intval($pages) - 1) as $page) {
            $img = pdf2png($row, $png_path, $page);
            $pdf->AddPage();
            $pdf->Image($img, 0, 0, 210, 297);
        }
    }
    //方法F,保存合并以后的PDF文件到指定的目录
    $pdf->output("F", $local_path);
}

/**
 * 获取PDF文件的页数
 * @param [type] $path 文件的绝对路径地址
 * @return void
 */
function getPageTotal($path)
{
    //打开文件
    if (!$fp = @fopen($path, 'r')) {
        return json(['code' => -1, 'msg' => '文件打开失败']);
    } else {
        //初始化参数
        $max = 0;
        while (!feof($fp)) {
            $line = fgets($fp, 255);
            if (preg_match("/\/Count [0-9]+/", $line, $matches)) {
                preg_match("/[0-9]+/", $matches[0], $matches2);
                if ($max < $matches2[0]) {
                    $max = $matches2[0];
                }
            }
        }
        fclose($fp);
        //返回页数
        return $max;
    }
}

/**
 * pdf文件转png图片
 * @param [type] $pdf PDF文件绝对路径地址
 * @param [type] $path 保存PNG图片地址
 * @param integer $page PDF的页数
 * @return void
 */
function pdf2png($pdf, $path, $page = 0)
{
    try {
        $im = new Imagick();
        $im->setResolution(120, 120); //设置图像分辨率
        $im->setCompressionQuality(100); //压缩比
        $im->readImage($pdf . "[" . $page . "]"); //设置读取pdf的第一页
        //$im->thumbnailImage(200, 100, true);//改变图像的大小
        //$im->scaleImage(200,100,true);//缩放大小图像
        $filename = $path . "/" . md5(time()) . '.png';
        if ($im->writeImage($filename) == true) {
            $Return = $filename;
        }
        return $Return;
    } catch (PDOException $e) {
        return ['code' => -1, 'msg' => '数据处理失败'];
    }
}
附上windows10环境下安装Imagick扩展的方法。

https://blog.csdn.net/WHROC21/article/details/105330023

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值