Welcome

首页 / 网页编程 / PHP / PHP 使用fpdf,fpdi类库操作修改pdf文件,添加文字和图片水印,fpdf,fpdi添加中文文字乱码问题

前言:最近遇到个需求,就是按学生的报名表自动生成合同,因为涉及内容动态填充的方式,

一开始我的想法是用GD类库绘图,最后也是成功了,但是因为合同涉及很多张图片,绘制的时间会很长,用户体验极差,后来就改用了这种直接修改pdf文件的办法,效率明显上升


安装

composer命令安装:composer require setasign/fpdi

composer命令安装:composer require setasign/fpdf

中文乱码问题

问题描述

在实际操作上就出现了问题。国外的fpdf 对中文支持并不是很好,在pdf上加入中文汉字的时候,会出现乱码。而且他只提供文件夹中的几种字体。而且这几种字体都是英文字体,所以无法正常支持汉字的写入。


解决办法

1.下载代码


https://github.com/DCgithub21/cd_FPDF


2.将上一步的源码放入vendor/setasigin/PDF_Chinese文件中



3.修改vendor\setasign\fpdi\src\FpdfTpl.php, 将他基础的fpdf类改成 咱们刚才引入的代码


namespace setasign\Fpdi;


include_once "../vendor/setasign/PDF_Chinese/chinese.php";


class FpdfTpl extends \PDF_Chinese

{

    use FpdfTplTrait;

}




实例

//引入类

use setasign\Fpdi\Fpdi;

use think\facade\Env;

use library\File;


/*

 * $user 用户信息

 * $path pdf文件路径

 */

public function pdf($user, $path)

{

$pdf = new Fpdi();

    //获取页数

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

$pdf->AddGBFont('simhei', '黑体');

$pdf->SetFont('simhei', '', 12);

    //遍历所有页面

for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {

        //导入页面

    $templateId = $pdf->importPage($pageNo);

    //简单的创建页面

    $pdf->AddPage();

    /*复杂的创建页面

    //获取导入页面的大小

        $size = $pdf->getTemplateSize($templateId);

        //创建页面(横向或纵向取决于导入的页面大小)

        if ($size['width'] > $size['height']){

            $pdf->AddPage('L', array($size['width'], $size['height']));

        }else {

            $pdf->AddPage('P', array($size['width'], $size['height']));

        }

        */

        // 在新增的頁面上使用引入的第$pageNo页

    $pdf->useTemplate($templateId);

    /*添加水印

    if($type == 1){//文字水印

            //设置字体

            //$pdf->SetFont('Arial','B','24');

            $family = ['courier', 'helvetica', 'times', 'symbol', 'zapfdingbats'];

            $pdf->SetFont('helvetica','U','50');

            //设置位置 - 加在中间位置

            $center_x = $size['width']/2;

            $center_y = $size['height']/2;

            $pdf->SetXY($center_x, $center_y);

            //写入水印 - 中文会乱码可以用iconv("utf-8","gbk",'内容')转换编码格式

            $pdf->Write(7, 'ROOT_ICO');

        }else{//图片水印

            $center_x = $size['width']/2 - 40;

            $center_y = $size['height']/2;

            $pdf->image("xxxx.png", $center_x, $center_y, 80, 0);//中间水印

            $pdf->image("xxxx.png", 0, 0,210);//全屏背景水印

        }

        */

    // 第一页

    if ($pageNo == 1) {

        // 应缴纳总费用

        $pdf->SetTextColor(0, 0, 0);//字体颜色

        $pdf->SetXY(75, 179);//xy定位

        $pdf->Write(5, $user['pay']);

        // 费用名称

            $pdf->SetXY(25, 210);

            $pdf->Write(5,iconv("utf-8","gbk",$user['title']));

    } else if($pageNo == 2) {

        

    }

}

$fileName = time().'.pdf';

if (strtoupper(substr(PHP_OS,0,3)) === 'WIN') {

$url =  Env::get('ROOT_PATH')."public\uploads\contract\\".$fileName;

} else {

    $url =  Env::get('ROOT_PATH').'public/uploads/contract/'.$fileName;

}

    //I输出output,D下载download,F保存file_put_contents,S返回return

    // 輸出成本地端 PDF 檔案

$pdf->Output('F', $url);

//将文件上传至七牛云

    $res = File::save($fileName,file_get_contents($url));

    if($res) {

        // 删除本地文件

        @unlink($url);

        return $res['url'];

    }else{

        return false;

    }

}


常见问题

错误:Function get_magic_quotes_gpc() is deprecated

解决:修改\vendor\setasign\PDF_Chinese\fpdf.php位置代码


if(get_magic_quotes_runtime()) @set_magic_quotes_runtime(0);

1

改为


if(@ini_get("magic_quotes_runtime")) @ini_set("magic_quotes_runtime",0);

1

错误:Undefined index: GB_widths

解决:修改\vendor\setasign\PDF_Chinese\chinese.php位置代码

添加代码


global $Big5_widths, $GB_widths;

1

结果