353 lines
11 KiB
PHP
353 lines
11 KiB
PHP
<?php
|
||
// +----------------------------------------------------------------------
|
||
// | ShopXO 国内领先企业级B2C免费开源电商系统
|
||
// +----------------------------------------------------------------------
|
||
// | Copyright (c) 2011~2099 http://shopxo.net All rights reserved.
|
||
// +----------------------------------------------------------------------
|
||
// | Licensed ( https://opensource.org/licenses/mit-license.php )
|
||
// +----------------------------------------------------------------------
|
||
// | Author: Devil
|
||
// +----------------------------------------------------------------------
|
||
namespace base;
|
||
|
||
use app\service\ResourcesService;
|
||
use TCPDF;
|
||
|
||
/**
|
||
* PDF
|
||
* @author Devil
|
||
* @blog http://gong.gg/
|
||
* @version 1.0.0
|
||
* @date 2023-03-07
|
||
* @desc html转pdf采用mpdt库、配置转pdf采用tcpdf库
|
||
*/
|
||
class PDF extends TCPDF
|
||
{
|
||
public $filename;
|
||
public $root_path;
|
||
public $path;
|
||
public $output_type;
|
||
public $title;
|
||
public $is_header;
|
||
public $is_footer;
|
||
public $header_logo;
|
||
public $header_name;
|
||
public $footer_content;
|
||
public $background_images;
|
||
public $watermark;
|
||
|
||
/**
|
||
* 参数初始化
|
||
* @author Devil
|
||
* @blog http://gong.gg/
|
||
* @version 1.0.0
|
||
* @date 2023-03-07
|
||
* @desc description
|
||
* @param [array] $params [输入参数]
|
||
*/
|
||
public function __construct($params = [])
|
||
{
|
||
parent::__construct();
|
||
// 标题
|
||
$this->filename = empty($params['filename']) ? date('YmdHis').'.pdf' : $params['filename'];
|
||
|
||
// 输出类型(I:在浏览器中打开、D:下载、F:在服务器生成pdf、S:只返回pdf的字符串)
|
||
$this->output_type = empty($params['output_type']) ? 'I' : $params['output_type'];
|
||
|
||
// 标题
|
||
if(!empty($params['title']))
|
||
{
|
||
$this->title = $params['title'];
|
||
}
|
||
|
||
// 页眉页脚
|
||
$this->is_header = isset($params['is_header']) ? $params['is_header'] : false;
|
||
$this->is_footer = isset($params['is_footer']) ? $params['is_footer'] : false;
|
||
|
||
// 头信息logo、名称
|
||
if(!empty($params['header_logo']))
|
||
{
|
||
$this->header_logo = $params['header_logo'];
|
||
}
|
||
if(!empty($params['header_name']))
|
||
{
|
||
$this->header_name = $params['header_name'];
|
||
}
|
||
// 页脚内容
|
||
if(!empty($params['footer_content']))
|
||
{
|
||
$this->footer_content = $params['footer_content'];
|
||
}
|
||
|
||
// 背景图片
|
||
if(!empty($params['background_images']))
|
||
{
|
||
$this->background_images = $params['background_images'];
|
||
}
|
||
|
||
// 水印
|
||
if(!empty($params['watermark']))
|
||
{
|
||
$this->watermark = $params['watermark'];
|
||
}
|
||
|
||
// 存储位置
|
||
$this->root_path = isset($params['root_path']) ? $params['root_path'] : ROOT.'public';
|
||
$this->path = isset($params['path']) ? $params['path'] : DS.'static'.DS.'upload'.DS.'file'.DS.'pdf'.DS.date('Y').DS.date('m').DS.date('d').DS;
|
||
}
|
||
|
||
/**
|
||
* TCPDF基础初始化
|
||
* @author Devil
|
||
* @blog http://gong.gg/
|
||
* @version 1.0.0
|
||
* @date 2023-03-07
|
||
* @desc 采用TCPDF组件
|
||
* @param [array] $params [输入参数]
|
||
* @return [object] [实例对象]
|
||
*/
|
||
public function BaseInit($params = [])
|
||
{
|
||
// 头页脚
|
||
$this->setPrintHeader($this->is_header);
|
||
$this->setPrintFooter($this->is_footer);
|
||
|
||
// 页脚信息
|
||
$this->setFooterData(array(0,64,0), array(0,64,128));
|
||
$this->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
|
||
$this->SetFooterMargin(PDF_MARGIN_FOOTER);
|
||
|
||
// 自动分页 (第二个参数可以设置距离底部多少距离时分页)
|
||
$this->setAutoPageBreak(true, 15);
|
||
|
||
// 设置边距(左 上 右 下) 右边距默认左侧值 下边距是bool值(是否覆盖默认页边距)
|
||
$this->setMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
|
||
|
||
// 定义默认的单间距字体 (设置为等宽字体)
|
||
$this->SetDefaultMonospacedFont('courier');
|
||
|
||
// 设置图像比例因子
|
||
$this->setImageScale(1.25);
|
||
|
||
// 设置字体
|
||
$this->SetFont('stsongstdlight', '', 12, '', true);
|
||
|
||
// 标题
|
||
if(!empty($this->title))
|
||
{
|
||
$this->setTitle($this->title);
|
||
}
|
||
|
||
// 新增页面
|
||
$this->AddPage();
|
||
}
|
||
|
||
/**
|
||
* 头设置
|
||
* @author Devil
|
||
* @blog http://gong.gg/
|
||
* @version 1.0.0
|
||
* @date 2023-03-09
|
||
* @desc description
|
||
*/
|
||
public function Header()
|
||
{
|
||
// 继承父级
|
||
parent::Header();
|
||
// 背景图
|
||
$this->BackgroundImage();
|
||
// 头logo
|
||
if(!empty($this->header_logo))
|
||
{
|
||
$this->Image($this->header_logo, 15, 4, 30, 6);
|
||
}
|
||
// 头名称
|
||
if(!empty($this->header_name))
|
||
{
|
||
$this->SetFont('stsongstdlight', '', 12, '', true);
|
||
$this->Cell(0, 16, $this->header_name, 0, 1, 'R');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 尾设置
|
||
* @author Devil
|
||
* @blog http://gong.gg/
|
||
* @version 1.0.0
|
||
* @date 2023-03-09
|
||
* @desc description
|
||
*/
|
||
public function Footer()
|
||
{
|
||
// 继承父级
|
||
parent::Footer();
|
||
// 背景图
|
||
$this->BackgroundImage();
|
||
// 页脚内容
|
||
if(!empty($this->footer_content))
|
||
{
|
||
$this->SetY(-15);
|
||
$this->SetFont('stsongstdlight', '', 8);
|
||
$this->setTextColor(136, 136, 136);
|
||
$this->Cell(0, 15, $this->footer_content, 0, 0, 'C');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 设置背景图
|
||
* @author Devil
|
||
* @blog http://gong.gg/
|
||
* @version 1.0.0
|
||
* @date 2023-03-09
|
||
* @desc description
|
||
*/
|
||
public function BackgroundImage()
|
||
{
|
||
if(!empty($this->background_images))
|
||
{
|
||
// get the current page break margin
|
||
$break_margin = $this->getBreakMargin();
|
||
// get current auto-page-break mode
|
||
$auto_page_break = $this->AutoPageBreak;
|
||
$this->SetAlpha(0.08);
|
||
// disable auto-page-break
|
||
$this->SetAutoPageBreak(false, 0);
|
||
// set background image
|
||
$this->Image($this->background_images, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
|
||
// restore auto-page-break status
|
||
$this->SetAutoPageBreak($auto_page_break, $break_margin);
|
||
// set the starting point for the page content
|
||
$this->setPageMark();
|
||
$this->SetAlpha(1);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* html转PDF
|
||
* @author Devil
|
||
* @blog http://gong.gg/
|
||
* @version 1.0.0
|
||
* @date 2023-03-07
|
||
* @desc 采用MPDF组件
|
||
* @param [array] $params [输入参数]
|
||
*/
|
||
public function HtmlToPDF($params = [])
|
||
{
|
||
// 基础参数
|
||
if(empty($params['html']))
|
||
{
|
||
return DataReturn(MyLang('common_extend.base.pdf.content_empty_tips'), -1);
|
||
}
|
||
|
||
// 生成pdf对象
|
||
$pdf = new \Mpdf\Mpdf([
|
||
// 自动匹配语言字体
|
||
'autoScriptToLang' => true,
|
||
'autoLangToFont' => true,
|
||
// 指定字体、避免中文符号乱码
|
||
'default_font' => 'gb',
|
||
// 编码
|
||
'mode' => 'utf-8',
|
||
]);
|
||
|
||
// 参数一是图片的位置(图片相对目录 为处理脚本的相对目录),参数二是透明度0.1-1
|
||
if(!empty($this->watermark))
|
||
{
|
||
$pdf->SetWatermarkImage($this->watermark, 0.5);
|
||
$pdf->showWatermarkImage = true;
|
||
}
|
||
|
||
// 设置PDF页眉内容
|
||
if($this->is_header && (!empty($this->header_logo) || !empty($this->header_name)))
|
||
{
|
||
$header = '<table width="100%" style="margin:0 auto;border-bottom: 1px solid #666; vertical-align: middle; font-family:serif;"><tr>';
|
||
$header .= '<td width="40%">';
|
||
if(!empty($this->header_logo))
|
||
{
|
||
$header .= '<img src="'.$this->header_logo.'" height="15" />';
|
||
}
|
||
$header .= '</td>';
|
||
$header .= '<td width="40%" align="right" style="font-size: 9pt; color: #666;">';
|
||
if(!empty($this->header_name))
|
||
{
|
||
$header .= $this->header_name;
|
||
}
|
||
$header .= '</td>';
|
||
$header .= '</tr></table>';
|
||
$pdf->SetHTMLHeader($header);
|
||
}
|
||
|
||
// 页脚内容
|
||
if($this->is_footer)
|
||
{
|
||
// 设置PDF页脚内容 在页脚html中添加 {PAGENO}/{nb} (当前页/总页数) 可添加页码
|
||
$footer = '<table width="100%" style=" vertical-align: bottom; font-family:serif; font-size: 9pt;"><tr>
|
||
<td width="10%"></td>';
|
||
if(!empty($this->footer_content))
|
||
{
|
||
$footer .= '<td width="80%" align="center" style="font-size:14px;color:#999">'.$this->footer_content.'</td>';
|
||
}
|
||
$footer .= '<td width="10%" align="right" style="color: #666;">{PAGENO}/{nb}</td>
|
||
</tr></table>';
|
||
$pdf->SetHTMLFooter($footer);
|
||
}
|
||
|
||
// 存储目录校验
|
||
$dir = $this->IsMkdir();
|
||
if($dir['code'] != 0)
|
||
{
|
||
return $dir;
|
||
}
|
||
|
||
// 标题
|
||
if(!empty($this->title))
|
||
{
|
||
$pdf->SetTitle($this->title);
|
||
}
|
||
|
||
// 加入内容
|
||
$pdf->WriteHTML($params['html']);
|
||
|
||
// PDF输出 I:在浏览器中打开,D:下载,F:在服务器生成pdf ,S:只返回pdf的字符串(此模式下$filename会被忽视)
|
||
$type = empty($params['type']) ? 'I' : $params['type'];
|
||
$file = ($type == 'F') ? $dir['data'].$this->filename : $this->filename;
|
||
$pdf->Output($file, $type);
|
||
|
||
// 服务器生成则返回
|
||
if($type == 'F')
|
||
{
|
||
$result = [
|
||
'dir' => $dir['data'].$this->filename,
|
||
'root' => $this->root_path,
|
||
'path' => $this->path,
|
||
'filename' => $this->filename,
|
||
'url' => ResourcesService::AttachmentPathViewHandle($this->path.$this->filename),
|
||
];
|
||
return DataReturn(MyLang('operate_success'), 0, $result);
|
||
}
|
||
die;
|
||
}
|
||
|
||
/**
|
||
* 路径不存在则创建
|
||
* @author Devil
|
||
* @blog http://gong.gg/
|
||
* @version 1.0.0
|
||
* @date 2018-06-29
|
||
* @desc description
|
||
*/
|
||
private function IsMkdir()
|
||
{
|
||
$dir = str_replace(['//', '\\\\'], ['/', '\\'], $this->root_path.$this->path);
|
||
if(!is_dir($dir))
|
||
{
|
||
// 创建目录
|
||
if(mkdir($dir, 0777, true) === false)
|
||
{
|
||
return DataReturn(MyLang('common_extend.base.pdf.dir_create_fail_tips'), -1);
|
||
}
|
||
}
|
||
return DataReturn(MyLang('operate_success'), 0, $dir);
|
||
}
|
||
}
|
||
?>
|