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 = '
';
$header .= '';
if(!empty($this->header_logo))
{
$header .= ' ';
}
$header .= ' | ';
$header .= '';
if(!empty($this->header_name))
{
$header .= $this->header_name;
}
$header .= ' | ';
$header .= '
';
$pdf->SetHTMLHeader($header);
}
// 页脚内容
if($this->is_footer)
{
// 设置PDF页脚内容 在页脚html中添加 {PAGENO}/{nb} (当前页/总页数) 可添加页码
$footer = '
| ';
if(!empty($this->footer_content))
{
$footer .= ''.$this->footer_content.' | ';
}
$footer .= '{PAGENO}/{nb} |
';
$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);
}
}
?>