php gd 生成表格 图片

public function create_table($params)
    {
        $data = array();//生成演示数据
        for($i = 0;$i < 10; $i++){
            $data[] = [
                'nice_name' => '测试名' . $i,
                'zhuang' => 100,
                'xian' => 50,
                'he' => 50,
                'zhuang_dui' => 500,
                'xian_dui' => 5000,
            ];
        }
 
        $params = [
            'row' => 11,//数据的行数
            'file_name' => 'xuju.png',
            'title' => '数据核对表',
            'table_time' => '2018-4-29 22:50:43',
            'data' => $data
        ];
        $base = [
            'border' => 10,//图片外边框
            'file_path' => 'public/create_image/check/12/',//图片保存路径
            'title_height' => 30,//报表名称高度
            'title_font_size' => 16,//报表名称字体大小
            'font_ulr' => 'resources/fonts/simhei.ttf',//字体文件路径
            'text_size' => 12,//正文字体大小
            'row_hight' => 30,//每行数据行高
            'filed_id_width' => 60,//序号列的宽度
            'filed_name_width' => 120,//玩家名称的宽度
            'filed_data_width' => 100,//数据列的宽度
            'table_header' => ['序号','昵称','数据1','数据2','数据3','数据4','数据5'],//表头文字
            'column_text_offset_arr' => [45,90,55,55,55,65,65],//表头文字左偏移量
            'row_text_offset_arr' => [50,110,90,90,90,90,90],//数据列文字左偏移量
        ];
 
        $base['img_width'] = $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 5 + $base['border'] * 2;//图片宽度
        $base['img_height'] = $params['row'] * $base['row_hight'] + $base['border'] * 2 + $base['title_height'];//图片高度
        $border_top = $base['border'] + $base['title_height'];//表格顶部高度
        $border_bottom = $base['img_height'] - $base['border'];//表格底部高度
        $base['column_x_arr'] = [
            $base['border'] + $base['filed_id_width'],//第一列边框线x轴像素
            $base['border'] + $base['filed_id_width'] + $base['filed_name_width'],//第二列边框线x轴像素
            $base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 1,//第三列边框线x轴像素
            $base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 2,//第四列边框线x轴像素
            $base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 3,//第五列边框线x轴像素
            $base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 4,//第五列边框线x轴像素
            $base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 5,//第五列边框线x轴像素
        ];
 
        $img = imagecreatetruecolor($base['img_width'], $base['img_height']);//创建指定尺寸图片
        $bg_color = imagecolorallocate($img, 255, 255, 190);//设定图片背景色
        $text_coler = imagecolorallocate($img, 0, 0, 0);//设定文字颜色
        $border_coler = imagecolorallocate($img, 0, 0, 0);//设定边框颜色
        $white_coler = imagecolorallocate($img, 255, 255, 255);//设定边框颜色
        imagefill($img, 0, 0, $bg_color);//填充图片背景色
        //先填充一个黑色的大块背景
        imagefilledrectangle($img, $base['border'], $base['border'] + $base['title_height'], $base['img_width'] - $base['border'], $base['img_height'] - $base['border'], $border_coler);//画矩形
        //再填充一个小两个像素的 背景色区域,形成一个两个像素的外边框
        imagefilledrectangle($img, $base['border'] + 2, $base['border'] + $base['title_height'] + 2, $base['img_width'] - $base['border'] - 2, $base['img_height'] - $base['border'] - 2, $bg_color);//画矩形
        //画表格纵线 及 写入表头文字
        foreach($base['column_x_arr'] as $key => $x){
            imageline($img, $x, $border_top, $x, $border_bottom,$border_coler);//画纵线
            imagettftext($img, $base['text_size'], 0, $x - $base['column_text_offset_arr'][$key] + 1, $border_top + $base['row_hight'] - 8, $text_coler, $base['font_ulr'], $base['table_header'][$key]);//写入表头文字
        }
        //画表格横线
        foreach($params['data'] as $key => $item){
            $border_top += $base['row_hight'];
            imageline($img, $base['border'], $border_top, $base['img_width'] - $base['border'], $border_top, $border_coler);
 
            imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][0] - $base['row_text_offset_arr'][0], $border_top + $base['row_hight'] - 10, $text_coler, $base['font_ulr'], $key + 1);//写入序号
            $sub = 0;
            foreach ($item as $value){
                $sub++;
                imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][$sub] - $base['row_text_offset_arr'][$sub], $border_top + $base['row_hight'] - 10, $text_coler, $base['font_ulr'], $value);//写入data数据
            }
        }
 
        //计算标题写入起始位置
        $title_fout_box = imagettfbbox($base['title_font_size'], 0, $base['font_ulr'], $params['title']);//imagettfbbox() 返回一个含有 8 个单元的数组表示了文本外框的四个角:
        $title_fout_width = $title_fout_box[2] - $title_fout_box[0];//右下角 X 位置 - 左下角 X 位置 为文字宽度
        $title_fout_height = $title_fout_box[1] - $title_fout_box[7];//左下角 Y 位置- 左上角 Y 位置 为文字高度
        //居中写入标题
        imagettftext($img, $base['title_font_size'], 0, ($base['img_width'] - $title_fout_width)/2, $base['title_height'], $text_coler, $base['font_ulr'], $params['title']);
        //写入制表时间
        imagettftext($img, $base['text_size'], 0, $base['border'], $base['title_height'], $text_coler, $base['font_ulr'], '时间:' . $params['table_time']);
 
        $save_path = $base['file_path'] . $params['file_name'];
 
        if(!is_dir($base['file_path']))//判断存储路径是否存在,不存在则创建
        {
            mkdir($base['file_path'],0777,true);//可创建多级目录
        }
 
        imagepng($img,$save_path);//输出图片,输出png使用imagepng方法,输出gif使用imagegif方法
 
        echo '<img src="/'.$save_path.'"/>';

字体文件路径需要修改

public function create_table()
    {

        $data = [
            "voucherCode"=>'123123',//回单号
            "eftCardNo"=>'123123',//收款卡号
            "recAccount"=>'123123',//收款账号
            "recAccountName"=>'万小明',//收款姓名
            "otherAccountOpenNode"=>'农行',//收款行
            "amount"=>"100",//金额
            "amountChinese"=>"壹佰元整",//大写金额
            "payAccount"=>"11111",//付款账号
            "payAccountName"=>"22222",//付款姓名
            "payAccountOpenBank"=>"33333",//付款行
            "transferDate"=>"44444",//交易日期
            "transferTime"=>"55555",//交易时间
            "bizhong"=>"66666",//币种
            "validateCode"=>"77777",//验证码
            "bsnCode"=>"88888",//交易代码
            "remark"=>"99999",//摘要
            "text"=>"00000",//附言
            "transferFlowNo"=>"121211111",//流水号
        ];
        $params = [
            'row' => 11,//数据的行数
            'file_name' => 'xuju.png',
            'title' => '电子回单',
            'table_time' => date("Y-m-d H:i:s"),
            'data' => $data
        ];
        $base = [
            'border' => 10,//图片外边框
            'file_path' => 'huidan/',//图片保存路径
            'title_height' => 30,//报表名称高度
            'title_font_size' => 16,//报表名称字体大小
            'font_ulr' => ROOT_PATH.'public/assets/common/fonts/msyh.ttf',//字体文件路径
            'text_size' => 12,//正文字体大小
            'row_hight' => 30,//每行数据行高
            'filed_id_width' => 60,//序号列的宽度
            'filed_name_width' => 160,//玩家名称的宽度
            'filed_data_width' => 100,//数据列的宽度
            'table_header' => ['序号', '昵称', '数据1', '数据2', '数据3', '数据4', '数据5'],//表头文字
            'column_text_offset_arr' => [45, 90, 55, 55, 55, 65, 65],//表头文字左偏移量
            'row_text_offset_arr' => [50, 110, 90, 90, 90, 90, 90],//数据列文字左偏移量
            'cell_width' => 80,//最小单元格宽度
        ];

        $base['img_width'] = $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 5 + $base['border'] * 2;//图片宽度
        $base['img_height'] = $params['row'] * $base['row_hight'] + $base['border'] * 2 + $base['title_height'];//图片高度
        $border_top = $base['border'] + $base['title_height'];//表格顶部高度
        $border_bottom = $base['img_height'] - $base['border'];//表格底部高度
        $base['column_x_arr'] = [
            $base['border'] + $base['filed_id_width'],//第一列边框线x轴像素
            $base['border'] + $base['filed_id_width'] + $base['filed_name_width'],//第二列边框线x轴像素
            $base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 1,//第三列边框线x轴像素
            $base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 2,//第四列边框线x轴像素
            $base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 3,//第五列边框线x轴像素
            $base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 4,//第五列边框线x轴像素
            $base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 5,//第五列边框线x轴像素
        ];

        $img = imagecreatetruecolor($base['img_width'], $base['img_height']);//创建指定尺寸图片
        $bg_color = imagecolorallocate($img, 255, 255, 190);//设定图片背景色
        $text_coler = imagecolorallocate($img, 0, 0, 0);//设定文字颜色
        $border_coler = imagecolorallocate($img, 0, 0, 0);//设定边框颜色
        $white_coler = imagecolorallocate($img, 255, 255, 255);//设定边框颜色
        imagefill($img, 0, 0, $bg_color);//填充图片背景色
        //先填充一个黑色的大块背景
        imagefilledrectangle($img, $base['border'], $base['border'] + $base['title_height'], $base['img_width'] - $base['border'], $base['img_height'] - $base['border'], $border_coler);//画矩形
        //再填充一个小两个像素的 背景色区域,形成一个两个像素的外边框
        imagefilledrectangle($img, $base['border'] + 2, $base['border'] + $base['title_height'] + 2, $base['img_width'] - $base['border'] - 2, $base['img_height'] - $base['border'] - 2, $bg_color);//画矩形
        //画表格纵线 及 写入表头文字
        //zll begin------------------
        //开始划线
        //回单_横线
        imageline($img, $base['border'], $border_top + $base['row_hight'], $base['img_width'] - $base['border'], $border_top + $base['row_hight'], $border_coler);
        //付款方_横线
        imageline($img, $base['border'], $border_top + $base['row_hight']*4, ($base['img_width'] - $base['border'])/2, $border_top + $base['row_hight']*4, $border_coler);
        //收款方_横线
        imageline($img, ($base['img_width'] - $base['border'])/2+$base['filed_name_width']/2, $border_top + $base['row_hight']*4, ($base['img_width'] - $base['border']), $border_top + $base['row_hight']*4, $border_coler);
        //付款方/收款方_小横线_4条
        imageline($img, $base['filed_name_width']/2, $border_top + $base['row_hight']*2, ($base['img_width'] - $base['border'])/2, $border_top + $base['row_hight']*2, $border_coler);
        imageline($img, $base['filed_name_width']/2, $border_top + $base['row_hight']*3, ($base['img_width'] - $base['border'])/2, $border_top + $base['row_hight']*3, $border_coler);
        imageline($img, ($base['img_width'] - $base['border'])/2+$base['filed_name_width']/2, $border_top + $base['row_hight']*2, ($base['img_width'] - $base['border']), $border_top + $base['row_hight']*2, $border_coler);
        imageline($img, ($base['img_width'] - $base['border'])/2+$base['filed_name_width']/2, $border_top + $base['row_hight']*3, ($base['img_width'] - $base['border']), $border_top + $base['row_hight']*3, $border_coler);
        //金额_横线
        imageline($img, $base['border'], $border_top + $base['row_hight']*5, $base['img_width'] - $base['border'], $border_top + $base['row_hight']*5, $border_coler);
        //币种_横线
        imageline($img, $base['border'], $border_top + $base['row_hight']*6, $base['img_width'] - $base['border'], $border_top + $base['row_hight']*6, $border_coler);
        //摘要_横线
        imageline($img, $base['border'], $border_top + $base['row_hight']*7, $base['img_width'] - $base['border'], $border_top + $base['row_hight']*7, $border_coler);
        //时间_横线
        imageline($img, $base['border'], $border_top + $base['row_hight']*8, $base['img_width'] - $base['border'], $border_top + $base['row_hight']*8, $border_coler);
        //中间竖线
        imageline($img, ($base['img_width'] - $base['border'])/2, $border_top+$base['row_hight'], ($base['img_width'] - $base['border'])/2, $base['img_height']-$base['border']-$base['row_hight']*3, $border_coler);
        //付款方_小竖线
        imageline($img, $base['filed_name_width']/2, $border_top+$base['row_hight'], $base['filed_name_width']/2, $border_top+$base['row_hight']*4, $border_coler);
        //付款方_大竖线
        imageline($img, $base['filed_name_width'], $border_top+$base['row_hight'], $base['filed_name_width'], $border_top+$base['row_hight']*11, $border_coler);
        //收款方_小竖线
        imageline($img, ($base['img_width'] - $base['border'])/2+$base['filed_name_width']/2, $border_top+$base['row_hight'], ($base['img_width'] - $base['border'])/2+$base['filed_name_width']/2, $border_top+$base['row_hight']*5, $border_coler);
        //收款方_大竖线
        imageline($img, ($base['img_width'] - $base['border'])/2+$base['filed_name_width'], $border_top+$base['row_hight'], ($base['img_width'] - $base['border'])/2+$base['filed_name_width'], $border_top+$base['row_hight']*8, $border_coler);
        //开始写字------
        //回单编号
        imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][0] - $base['row_text_offset_arr'][0], $border_top + $base['row_hight'] - 10, $text_coler, $base['font_ulr'], "回单编号:".$data['voucherCode']);
        //付款方_文字
        imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][0] - $base['row_text_offset_arr'][0], $border_top + $base['row_hight']*3 - 10, $text_coler, $base['font_ulr'], "付款方");
        //付款方_账号_文字
        imagettftext($img, $base['text_size'], 0, $base['border']+$base['cell_width'], $border_top + $base['row_hight']*2 - 10, $text_coler, $base['font_ulr'], "账号");
        imagettftext($img, $base['text_size'], 0, $base['border']+$base['cell_width']*2+10, $border_top + $base['row_hight']*2 - 10, $text_coler, $base['font_ulr'], $data['payAccount']);
        //付款方_户名_文字
        imagettftext($img, $base['text_size'], 0, $base['border']+$base['cell_width'], $border_top + $base['row_hight']*3 - 10, $text_coler, $base['font_ulr'], "户名");
        imagettftext($img, $base['text_size'], 0, $base['border']+$base['cell_width']*2+10, $border_top + $base['row_hight']*3 - 10, $text_coler, $base['font_ulr'], $data['payAccountName']);
        //付款方_开户行_文字
        imagettftext($img, $base['text_size'], 0, $base['border']+$base['cell_width'], $border_top + $base['row_hight']*4 - 10, $text_coler, $base['font_ulr'], "开户行");
        imagettftext($img, $base['text_size'], 0, $base['border']+$base['cell_width']*2+10, $border_top + $base['row_hight']*4 - 10, $text_coler, $base['font_ulr'], $data['payAccountOpenBank']);
        //收款方_文字
        imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][3] - $base['row_text_offset_arr'][0], $border_top + $base['row_hight']*3 - 10, $text_coler, $base['font_ulr'], "收款方");
        //收款方_账号_文字
        imagettftext($img, $base['text_size'], 0, ($base['img_width'] - $base['border'])/2+$base['cell_width']+10, $border_top + $base['row_hight']*2 - 10, $text_coler, $base['font_ulr'], "账号");
        imagettftext($img, $base['text_size'], 0, $base['img_width']/2+$base['cell_width']*2+10, $border_top + $base['row_hight']*2 - 10, $text_coler, $base['font_ulr'], $data['recAccount']);
        //收款方_户名_文字
        imagettftext($img, $base['text_size'], 0, ($base['img_width'] - $base['border'])/2+$base['cell_width']+10, $border_top + $base['row_hight']*3 - 10, $text_coler, $base['font_ulr'], "户名");
        imagettftext($img, $base['text_size'], 0, $base['img_width']/2+$base['cell_width']*2+10, $border_top + $base['row_hight']*3 - 10, $text_coler, $base['font_ulr'], $data['recAccountName']);
        //收款方_开户行_文字
        imagettftext($img, $base['text_size'], 0, ($base['img_width'] - $base['border'])/2+$base['cell_width']+10, $border_top + $base['row_hight']*4 - 10, $text_coler, $base['font_ulr'], "开户行");
        imagettftext($img, $base['text_size'], 0, $base['img_width']/2+$base['cell_width']*2+10, $border_top + $base['row_hight']*4 - 10, $text_coler, $base['font_ulr'], $data['otherAccountOpenNode']);
        //收款方卡号_文字
        imagettftext($img, $base['text_size'], 0, ($base['img_width'] - $base['border'])/2+$base['cell_width']+10, $border_top + $base['row_hight']*5 - 10, $text_coler, $base['font_ulr'], "卡号");
        imagettftext($img, $base['text_size'], 0, $base['img_width']/2+$base['cell_width']*2+10, $border_top + $base['row_hight']*5 - 10, $text_coler, $base['font_ulr'], $data['eftCardNo']);
        //金额_小写_文字
        imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][0] - $base['row_text_offset_arr'][0]+10, $border_top + $base['row_hight']*5 - 10, $text_coler, $base['font_ulr'], "金额(小写)");
        imagettftext($img, $base['text_size'], 0, $base['border']+$base['cell_width']*2+10, $border_top + $base['row_hight']*5 - 10, $text_coler, $base['font_ulr'], $data['amount']);
        //金额_大写_文字
        imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][0] - $base['row_text_offset_arr'][0]+10, $border_top + $base['row_hight']*6 - 10, $text_coler, $base['font_ulr'], "金额(大写)");
        imagettftext($img, $base['text_size'], 0, $base['border']+$base['cell_width']*2+10, $border_top + $base['row_hight']*6 - 10, $text_coler, $base['font_ulr'], $data['amountChinese']);
        //交易渠道_文字
        imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][3] - $base['row_text_offset_arr'][0]+10, $border_top + $base['row_hight']*6 - 10, $text_coler, $base['font_ulr'], "交易渠道");
        imagettftext($img, $base['text_size'], 0, $base['img_width']/2+$base['cell_width']*2+10, $border_top + $base['row_hight']*6 - 10, $text_coler, $base['font_ulr'], $data['bsnCode']);
        //摘要_文字
        imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][0] - $base['row_text_offset_arr'][0]+10, $border_top + $base['row_hight']*7 - 10, $text_coler, $base['font_ulr'], "摘要");
        imagettftext($img, $base['text_size'], 0, $base['border']+$base['cell_width']*2+10, $border_top + $base['row_hight']*7 - 10, $text_coler, $base['font_ulr'], $data['remark']);
        //验证码_文字
        imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][3] - $base['row_text_offset_arr'][0]+10, $border_top + $base['row_hight']*7 - 10, $text_coler, $base['font_ulr'], "验证码");
        imagettftext($img, $base['text_size'], 0, $base['img_width']/2+$base['cell_width']*2+10, $border_top + $base['row_hight']*7 - 10, $text_coler, $base['font_ulr'], $data['validateCode']);
        //交易时间_文字
        imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][0] - $base['row_text_offset_arr'][0]+10, $border_top + $base['row_hight']*8 - 10, $text_coler, $base['font_ulr'], "交易时间");
        imagettftext($img, $base['text_size'], 0, $base['border']+$base['cell_width']*2+10, $border_top + $base['row_hight']*8 - 10, $text_coler, $base['font_ulr'], $data['transferDate'].$data['transferTime']);
        //币种_文字
        imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][3] - $base['row_text_offset_arr'][0]+10, $border_top + $base['row_hight']*8 - 10, $text_coler, $base['font_ulr'], "币种");
        imagettftext($img, $base['text_size'], 0, $base['img_width']/2+$base['cell_width']*2+10, $border_top + $base['row_hight']*8 - 10, $text_coler, $base['font_ulr'], $data['bizhong']);
        //附言_文字
        imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][0] - $base['row_text_offset_arr'][0]+10, $border_top + $base['row_hight']*10 - 10, $text_coler, $base['font_ulr'], "附言");
        imagettftext($img, $base['text_size'], 0, $base['border']+$base['cell_width']*2+10, $border_top + $base['row_hight']*9 - 10, $text_coler, $base['font_ulr'], $data['transferDate'].$data['text']);
        //zll end--------------------------
//        foreach ($base['column_x_arr'] as $key => $x) {
//            imageline($img, $x, $border_top, $x, $border_bottom, $border_coler);//画纵线
//            imagettftext($img, $base['text_size'], 0, $x - $base['column_text_offset_arr'][$key] + 1, $border_top + $base['row_hight'] - 8, $text_coler, $base['font_ulr'], $base['table_header'][$key]);//写入表头文字
//        }
        //画表格横线
//        foreach ($params['data'] as $key => $item) {
//            $border_top += $base['row_hight'];
//            imageline($img, $base['border'], $border_top, $base['img_width'] - $base['border'], $border_top, $border_coler);
//
//            imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][0] - $base['row_text_offset_arr'][0], $border_top + $base['row_hight'] - 10, $text_coler, $base['font_ulr'], $key + 1);//写入序号
//            $sub = 0;
//            foreach ($item as $value) {
//                $sub++;
//                imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][$sub] - $base['row_text_offset_arr'][$sub], $border_top + $base['row_hight'] - 10, $text_coler, $base['font_ulr'], $value);//写入data数据
//            }
//        }

        //计算标题写入起始位置
        $title_fout_box = imagettfbbox($base['title_font_size'], 0, $base['font_ulr'], $params['title']);//imagettfbbox() 返回一个含有 8 个单元的数组表示了文本外框的四个角:
        $title_fout_width = $title_fout_box[2] - $title_fout_box[0];//右下角 X 位置 - 左下角 X 位置 为文字宽度
        $title_fout_height = $title_fout_box[1] - $title_fout_box[7];//左下角 Y 位置- 左上角 Y 位置 为文字高度
        //居中写入标题
        imagettftext($img, $base['title_font_size'], 0, ($base['img_width'] - $title_fout_width) / 2, $base['title_height'], $text_coler, $base['font_ulr'], $params['title']);
        //写入制表时间
        imagettftext($img, $base['text_size'], 0, $base['border'], $base['title_height'], $text_coler, $base['font_ulr'], '时间:' . $params['table_time']);

//        $save_path = $base['file_path'] . $params['file_name'];
//
//        if (!is_dir($base['file_path']))//判断存储路径是否存在,不存在则创建
//        {
//            mkdir($base['file_path'], 0777, true);//可创建多级目录
//        }
//
//        imagepng($img, $save_path);//输出图片,输出png使用imagepng方法,输出gif使用imagegif方法
//
//        echo '<img src="/' . $save_path . '"/>';
//        header("Content-type:image/png");
        header('Content-Type: image/png');
        imagepng($img);
        die;//tp5框架会自动增加头信息,需要die;
    }